C ++添加仅在调试时运行的调试代码

Posted

技术标签:

【中文标题】C ++添加仅在调试时运行的调试代码【英文标题】:C++ adding Debugging code that only runs when Debugging 【发布时间】:2010-11-16 23:11:34 【问题描述】:

正如问题所解释的:我想添加一些仅在程序附加到调试器时运行的调试代码。我想这个 flagpre-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
    // ...

注册表项

定义一个初始化为0DWORD注册表值,但您可以通过注册表编辑器覆盖为1

然后,您可以将此注册表值设置为1. 为条件设置调试代码,这可能是一个更好的选择,因为您可以在外部控制此值,而不必在调试器中中断以在适当的时间设置全局变量。

【讨论】:

【参考方案2】:

如果您想在调试/发布版本中包含或不包含某些代码,通常会为调试版本定义 _DEBUG 预处理器宏(至少,在 MSVC++ CRT 中,这是惯例),但它不会检测到如果附加了调试器,它只会让您为调试/发布构建包含不同的代码。

如果您想要对附加的调试器进行运行时检查,您应该使用IsDebuggerPresent API,它会检测是否附加了用户模式调试器。

请注意,它不是 100% 可靠的,因为通过一些不那么困难的工作,调试器可能会欺骗您的应用程序。换句话说,它对安全/反作弊保护和这类东西不利,它更多的是为调试器启用额外的帮助(例如,正如页面本身所说,使用OutputDeubgString 输出更多诊断信息等) .此外,它不会检测内核模式的调试器,它们可以做任何他们想做的事情。

无论如何,我建议您避免将这个函数用于复杂的东西,因为您在附加调试器时会引入不同的代码路径,这会使调试“奇怪”的错误变得非常困难。我间接使用的所有呈现这种行为的代码(例如几乎没有记录的 Windows 调试堆)总是让我头疼。

【讨论】:

【参考方案3】:

在你的程序中设置一个全局变量in_debuggerfalse。将此变量上的所有调试代码设置为true。附加调试器时将变量设置为true

【讨论】:

【参考方案4】:

对此有更直接的方法。您可以在调试器会话期间手动调用您选择的函数:http://sourceware.org/gdb/onlinedocs/gdb/Calling.html

问候, 马辛

【讨论】:

以上是关于C ++添加仅在调试时运行的调试代码的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA数据验证交换仅在调试模式下工作

VS2010调试C的代码老是提示此项目过期

C Hangman 程序调试辅助(中止陷阱:6 错误)[关闭]

qt纯c代码运行窗口如何调出

测试不会在调试模式 C# 下运行

VB 代码不会在断点处停止