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

Jic*_*hao 6 c++ debugging visual-c++

我创建了一个宏,

#define DEBUG_BREAK(a) if (a) __asm int 3;
Run Code Online (Sandbox Code Playgroud)

但问题是如果没有附加调试器,程序将运行不正确.

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

我怎么能这样做?

0xC*_*22L 6

对于你想要做的事情,如果你使用正确的暴露kernel32.dll功能会更好DebugBreak.基本上就是这样

#define DEBUG_BREAK(a) if(a) if (IsDebuggerPresent()) DebugBreak()
Run Code Online (Sandbox Code Playgroud)

或者不是做__asm int 3例程,而是使用VC提供的内在函数__debugbreak,即:

#define DEBUG_BREAK(a) if(a) if (IsDebuggerPresent()) __debugbreak()
Run Code Online (Sandbox Code Playgroud)

后者int 3文档中/clr指出的编译时有所不同(相比较).当然内在并不总是存在,所以取决于你的VS/VC版本(你没有声明).

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


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

#ifdef _DEBUG
#   define DEBUG_BREAK(a) if(a) __debugbreak()
#else
#   define DEBUG_BREAK(a) do {} while(0)
#endif
Run Code Online (Sandbox Code Playgroud)


Mat*_*son 5

您可以使用CheckRemoteDebuggerPresentIsDebuggerPresent- 和不,CheckRemoteDebuggerPresent并不一定意味着调试器在不同的机器上运行,只是系统中有一个调试进程可以处理断点等(使用远程调试器时,有一个小进程在目标系统上也是如此,这就是它的来源)。

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