.net - 托管 System::Diagnostics::Debugger::Launch 函数的非托管/ native 替代方案?

标签 .net windows debugging breakpoints

我有一个混合模式应用程序,如果在内部数据结构中发现错误,我想启动调试器。 奇怪的是,DebugBreak 和 __debugbreak 函数似乎没有按预期工作(.Net 框架似乎拦截了断点异常,导致各种令人讨厌的副作用)。

我之前的问题的解决方案(请参阅 Behavior of DebugBreak differs between unmanaged and mixed (unmanaged+managed) application? )似乎适用于非常简单的情况,但不适用于我的应用程序(它只会让我的应用程序挂起)。

幸运的是,我发现执行System::Diagnostics::Debugger::Launch似乎可以解决问题。但是,我需要这种逻辑的地方既在非托管应用程序中使用,又在混合模式应用程序中使用。另外,在我想放置逻辑的地方调用托管代码相当困难。

因此:System::Diagnostics::Debugger::Launch 函数是否有非托管替代方案?

最佳答案

在我看来,使用 System::Diagnostics::Debugger::Launch 是一个好点。 .NET 调试器与其他一些 .NET 类一样也有 unmanaged interface例如ICorDebug::DebugActiveProcess 。在我看来你应该尝试使用它。您可以在http://msdn.microsoft.com/en-us/magazine/cc301510.aspx中阅读更多相关信息。 。这是行不通的,您可以尝试在 .NET 中仅使用一种调用 System::Diagnostics::Debugger::Launch 的方法编写自己的小型 COM 接口(interface)。 .

另一种方法是使用 Just-In-Time DebuggingHow to: Launch the Debugger Automatically .

如果您不需要调试应用程序的启动代码,您可以通过非常简单的方式执行您想要的操作:在主线程(或您想要调试的所有线程)中的应用程序开始时,您可以显示一个消息框。看到消息框后,您可以以管理员身份启动 Visual Studio 并使用“调试”/“附加到进程...”。效果非常好。如果您想调试 Windows 服务,您应该使用 WTSSendMessage而不是MessageBox 。我多年来一直使用这种方法,效果非常好。

关于.net - 托管 System::Diagnostics::Debugger::Launch 函数的非托管/ native 替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3702393/

相关文章:

c# - 无法将 C# dll 注册为 COM 组件,模块已加载但未找到入口点 DLLRegisterServer

c# - 如何比较枚举值和整数值?

.net - 如何获取FaultException的完整调用堆栈

c# - 这个 Resharper 对处置关闭警告的修复是否有意义?

python - 更改外壳文本颜色 (Windows)

java - 使用 Windows 服务在 Windows 上远程访问文件

c# - 在 Visual Studio 2010 中使用扩展对象调试 XSLT

c++ - _Block_Type_Is_Valid (pHead->nBlockUse) 错误

JavaFX 进度条在调整大小后导致严重的窗口滞后

匹配运算符的 Perl 内存泄漏