【发布时间】:2017-09-16 20:36:02
【问题描述】:
是的,我知道,我知道,有很多类似的问题,但那里的答案对我来说并不合适。我的设置可能有点复杂,也许。该解决方案有两个项目(均使用 .NET 4.5.2):
- 托管的 C# 64 位(或可能是 32 位)应用程序,
- 一个 C++/CLI Windows 服务,由于使用了 SDK,严格来说是 32 位。
服务在运行时发生未处理的访问冲突崩溃,不是在我的代码中,而是在 SDK 深处回调我的代码的某个地方。事件查看器告诉我它在 ntdll.dll 中,但仅此而已。
有多种调试方法,但我发现最方便的方法是将服务作为独立的控制台应用程序启动,在其Main() 中调用System::Diagnostics::Debugger::Launch()。这允许我将它附加到 VS 调试器。它正在运行良好。
我现在启动主应用程序并转到发生崩溃的部分。无论我是在第二个 VS 调试器下启动它还是直接从 UI 运行(Windows 提供在第二种情况下选择调试器),下一个对话框都将是通常的错误消息(见标题)。然而:
- 项目设置为调试混合代码(服务),包含原生代码(主应用),
- 主应用设置了允许不安全代码(出于不相关的原因,但一些答案表明这也有助于混合代码调试),
- 调试器设置为处理所有 Win32 和 C++ 异常。
因此,导致此错误的常见问题得到解决。还有什么可能导致我无法调试此服务?
【问题讨论】:
-
一个 C++/CLI 项目需要传统的托管调试引擎,从问题中不清楚你是否处理了这个问题。新的调试引擎有几种奇怪的行为方式。工具 > 选项 > 调试 > 常规 > 勾选“使用托管兼容模式”复选框。顺便说一句,当您将其永久保留时,生活会大大简化,新引擎是一个讨厌的包'o bug。
-
托管和本机兼容模式均已检查。
-
缺少太多细节。 “Windows 提供调试”,这是否意味着您在没有调试器的情况下启动了主应用程序?好吧,不要那样做,有太多方法会出错,比如选择正在运行的 VS 实例或选择错误的调试引擎。只需启动 VS 两次。
-
不幸的是,两个 VS 运行或仅一个(主应用程序处于调试模式但不在调试器下运行)都没有区别。 “Win 提供调试”仅指通常的对话框“Windows 寻找解决方案”和底部的 Debug 按钮。
-
汉斯,我稍微编辑了问题以包含这些细节。无论我如何启动这些部分,问题是在实际调试访问冲突时,(否则看似正确设置调试器,附加并运行)拒绝调试,说明它无法处理此异常。这一定是这里的一些特定问题,而不是一般问题,因为我确实成功调试了同一应用程序的其他部分中的类似问题。
标签: c# .net debugging service c++-cli