托管System :: Diagnostics :: Debugger :: Launch函数的非托管/本机替代方案?

时间:2010-09-13 16:29:08

标签: .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函数是否存在非托管替代方法?

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

_asm int 3; // I need to enter this to satisfy StackOverflow minimal answer length requirement