6

我创建了一个宏,

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

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

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

我怎么能这样做?

4

2 回答 2

7

对于您想要做的事情,如果您使用适当的暴露kernel32.dll函数会更好DebugBreak。基本上沿着

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

或者不执行__asm int 3例程,而是使用 VC 提供的 intrinsic __debugbreak,即:

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

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
于 2013-08-21T11:55:30.773 回答
5

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

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

于 2013-05-22T08:40:20.363 回答