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

Posted

技术标签:

【中文标题】如何检测c++中是不是附加了调试器?【英文标题】:How to detect whether there is a debugger attached in c++?如何检测c++中是否附加了调试器? 【发布时间】:2013-05-22 08:34:57 【问题描述】:

我已经创建了一个宏,

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

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

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

我该怎么做?

【问题讨论】:

***.com/questions/4818628/… 的可能副本 【参考方案1】:

对于您想要做的事情,最好使用适当的暴露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()

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

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


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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

如果我使用函数,调试器会在函数中中断,这不是我想要的。 @Useless:我需要在输入DEBUG_BREAK的地方打断,否则我宁愿在visual studio中使用断点。 @Jichao 单击“步骤”按钮应该可以让您到达放置 DEBUG_BREAK 的位置。除非我完全错过了什么...... @MatsPetersson:是的 shift+f11 可以将我发送给 DEBUG_BREAK 的调用者,但如果我使用宏,程序将在调用者的右侧而不是函数的内部停止。

以上是关于如何检测c++中是不是附加了调试器?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 判断是不是附加了调试器

有没有办法检测附加的调试器是不是是远程调试器?

如何附加调试器以从托管(C#)包装器进入本机(C++)代码?

如何检测是不是调试

C++ 从命令行附加 Visual Studio 调试器

是否可以防止调试器附加到 Android 上?