C ++添加仅在调试时运行的调试代码
Posted
技术标签:
【中文标题】C ++添加仅在调试时运行的调试代码【英文标题】:C++ adding Debugging code that only runs when Debugging 【发布时间】:2010-11-16 23:11:34 【问题描述】:正如问题所解释的:我想添加一些仅在程序附加到调试器时运行的调试代码。我想这个 flag
或 pre-processor
变量对于每个编译器都会有所不同......
就我而言,我使用的是带有 C++ 的 Microsoft Visual Studio 2010。
我还在家里的另一台计算机上使用 Eclipse,运行 Ubuntu 10.4 并再次使用 C++。
【问题讨论】:
这可能会产生一些非常棒的海森虫。 如果程序是在启用指令的情况下编译的,预处理器指令将允许您运行不同的代码(例如,_DEBUG
是为调试构建自动定义的) - 但这些指令与是否程序实际上是附加到调试器的。
【参考方案1】:
这个问题可能意味着两件事中的一件:
-
仅基于构建配置运行的代码(例如发布与调试)
仅在附加了调试器时运行的代码
基于构建配置
这可以通过使用与您的编译器相关的预处理器宏来解决(例如_DEBUG for the Win32 CRT)。
根据是否附加调试器
这可以通过几种不同的方式解决。
全局布尔变量
我发现的一种方法是定义一个初始化为false
的全局布尔变量,如下所示:
bool gDebug = false;
当我使用调试器附加到代码时,中断代码并通过 Watch 窗口用 true
覆盖 gDebug
。然后,如果设置为 true,则可以添加有条件运行的代码:
if (gDebug)
// Debugger is attached, so run this code
// ...
注册表项
定义一个初始化为0
的DWORD
注册表值,但您可以通过注册表编辑器覆盖为1
。
然后,您可以将此注册表值设置为1.
为条件设置调试代码,这可能是一个更好的选择,因为您可以在外部控制此值,而不必在调试器中中断以在适当的时间设置全局变量。
【讨论】:
【参考方案2】:如果您想在调试/发布版本中包含或不包含某些代码,通常会为调试版本定义 _DEBUG
预处理器宏(至少,在 MSVC++ CRT 中,这是惯例),但它不会检测到如果附加了调试器,它只会让您为调试/发布构建包含不同的代码。
如果您想要对附加的调试器进行运行时检查,您应该使用IsDebuggerPresent API,它会检测是否附加了用户模式调试器。
请注意,它不是 100% 可靠的,因为通过一些不那么困难的工作,调试器可能会欺骗您的应用程序。换句话说,它对安全/反作弊保护和这类东西不利,它更多的是为调试器启用额外的帮助(例如,正如页面本身所说,使用OutputDeubgString 输出更多诊断信息等) .此外,它不会检测内核模式的调试器,它们可以做任何他们想做的事情。
无论如何,我建议您避免将这个函数用于复杂的东西,因为您在附加调试器时会引入不同的代码路径,这会使调试“奇怪”的错误变得非常困难。我间接使用的所有呈现这种行为的代码(例如几乎没有记录的 Windows 调试堆)总是让我头疼。
【讨论】:
【参考方案3】:在你的程序中设置一个全局变量in_debugger
为false
。将此变量上的所有调试代码设置为true
。附加调试器时将变量设置为true
。
【讨论】:
【参考方案4】:对此有更直接的方法。您可以在调试器会话期间手动调用您选择的函数:http://sourceware.org/gdb/onlinedocs/gdb/Calling.html
问候, 马辛
【讨论】:
以上是关于C ++添加仅在调试时运行的调试代码的主要内容,如果未能解决你的问题,请参考以下文章