我有一个混合模式应用程序,如果在内部数据结构中发现错误,我想启动调试器。 奇怪的是,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 Debugging和 How to: Launch the Debugger Automatically .
如果您不需要调试应用程序的启动代码,您可以通过非常简单的方式执行您想要的操作:在主线程(或您想要调试的所有线程)中的应用程序开始时,您可以显示一个消息框。看到消息框后,您可以以管理员身份启动 Visual Studio 并使用“调试”/“附加到进程...”。效果非常好。如果您想调试 Windows 服务,您应该使用 WTSSendMessage而不是MessageBox 。我多年来一直使用这种方法,效果非常好。
关于.net - 托管 System::Diagnostics::Debugger::Launch 函数的非托管/ native 替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3702393/