我创建了一个宏
#define DEBUG_BREAK(a) if (a) __asm int 3;
但问题是如果没有连接调试器,程序将运行不正确。
所以我需要知道是否附加了调试器。如果有调试器,应用程序应调用int 3
。否则,它不应该。
我怎么能这样做?
答案 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)
您可以使用CheckRemoteDebuggerPresent
或IsDebuggerPresent
- 否,CheckRemoteDebuggerPresent
并不一定意味着调试器在不同的计算机上运行,只是在系统中有调试过程可以处理断点等(当使用远程调试器时,目标系统上也有一个小进程,它来自哪里)。
编辑:在这一点上,我肯定会建议某种形式的功能,而不是宏。