如何检测c ++中是否附加了调试器?

时间:2013-05-22 08:34:58

标签: c++ debugging visual-c++

我创建了一个宏

#define DEBUG_BREAK(a) if (a) __asm int 3;

但问题是如果没有连接调试器,程序将运行不正确。

所以我需要知道是否附加了调试器。如果有调试器,应用程序应调用int 3。否则,它不应该。

我怎么能这样做?

2 个答案:

答案 0 :(得分:6)

对于您想要做的事情,如果您使用正确的公开kernel32.dll函数DebugBreak会更好。

基本上是这样的
#define DEBUG_BREAK(a) if(a) if (IsDebuggerPresent()) DebugBreak()

或代替执行__asm int 3例程,使用VC提供的内在__debugbreak,即:

#define DEBUG_BREAK(a) if(a) if (IsDebuggerPresent()) __debugbreak()

后者与int 3进行编译时指出in the documentation会有所不同(与/clr相比)。当然内在并不总是存在,所以取决于你的VS / VC版本(你没有声明)。

在这两种情况下,windows.h至少需要IsDebuggerPresent()


但是,这就是您进行调试和发布构建并有条件地构建这些内容的确切原因。请记住,尽管您努力将断点放在代码中,优化器仍可以在调试器中将结果混淆。原因很简单,源代码中的某些行将不再被表示或将以确定的方式更改。因此,对两者使用一种配置并没有多大意义。所以我所说的是使用以下内容:

#ifdef _DEBUG
#   define DEBUG_BREAK(a) if(a) __debugbreak()
#else
#   define DEBUG_BREAK(a) do {} while(0)
#endif

答案 1 :(得分:4)

您可以使用CheckRemoteDebuggerPresentIsDebuggerPresent - 否,CheckRemoteDebuggerPresent并不一定意味着调试器在不同的计算机上运行,​​只是在系统中有调试过程可以处理断点等(当使用远程调试器时,目标系统上也有一个小进程,它来自哪里)。

编辑:在这一点上,我肯定会建议某种形式的功能,而不是宏。