代码之家  ›  专栏  ›  技术社区  ›  Wallter

添加调试时只运行的调试代码

  •  3
  • Wallter  · 技术社区  · 15 年前

    正如问题所解释的:我想添加一些调试代码,这些代码只在程序附加到调试器时运行。我可以想象 flag 或 pre-processor 变量对于每个编译器都是不同的。。。

    在我的例子中,我使用的是微软Visual Studio 2010与C++。

    我还使用Eclipse在家中运行Ubuntu 10.4的另一台计算机,并在C++中使用。

    4 回复  |  直到 10 年前
        1
  •  4
  •   LeopardSkinPillBoxHat    15 年前

    这个问题可能意味着以下两点之一:

    1. 仅基于 生成配置 (例如,发布与调试)
    2. 只在 已附加调试器

    基于生成配置

    这可以通过使用与编译器相关的预处理器宏(例如。 _DEBUG for the Win32 CRT ).

    基于是否附加调试器

    这可以用几种不同的方法来解决。

    全局布尔变量

    我发现的一种方法是定义一个全局布尔变量,它初始化为 false ,就像这样:

    bool gDebug = false;
    

    当我用调试器附加到代码时,中断代码并重写 gDebug 具有 true 通过 监视 窗户。如果设置为true,则可以添加有条件运行的代码:

    if (gDebug)
    {
        // Debugger is attached, so run this code
        // ...
    }
    

    注册表项

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

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

        2
  •  2
  •   Matteo Italia    15 年前

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

    如果需要对附加的调试器进行运行时检查,则应使用 IsDebuggerPresent API,用于检测是否附加了用户模式调试器。

    请注意,它不是100%可靠的,因为在一些不那么困难的工作中,调试器会使它对您的应用程序撒谎。换言之,它不利于安全/防欺骗保护和这类东西,更多的是启用对调试器的额外帮助(例如,正如页面本身所说,使用 OutputDeubgString 等等)。而且,它不会检测内核模式的调试器,它们可以做任何他们想做的事情。

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

        3
  •  0
  •   Keith Randall    15 年前

    设置全局变量 in_debugger 到 false 在你的程序中。将此变量上的所有仅调试代码条件为 true . 将变量设置为 真的 当您附加调试器时。

        4
  •  0
  •   Marcin    15 年前

    有一种更直接的方法来解决这个问题。在调试器会话期间,可以手动调用所选函数:
    http://sourceware.org/gdb/onlinedocs/gdb/Calling.html

    当做,
    马尔金