6

正如问题所解释的:我想添加一些仅在程序附加到调试器时运行的调试代码。我想这个flagpre-processor变量对于每个编译器都会有所不同......

就我而言,我使用的是带有 C++ 的 Microsoft Visual Studio 2010。

我还在家里另一台运行 Ubuntu 10.4 和 C++ 的计算机上使用 Eclipse。

4

4 回答 4

4

这个问题可能意味着两件事之一:

  1. 仅基于构建配置运行的代码(例如发布与调试)
  2. 仅在附加调试器时运行的代码

基于构建配置

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

基于是否附加调试器

这可以通过几种不同的方式解决。

全局布尔变量

我发现的一种方法是定义一个初始化为的全局布尔变量false,如下所示:

bool gDebug = false;

当我使用调试器附加到代码时,中断代码并gDebug通过trueWatch窗口覆盖。然后,如果设置为 true,您可以添加有条件运行的代码:

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

注册表项

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

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

于 2010-11-16T23:20:41.780 回答
2

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

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

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

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

于 2010-11-16T23:26:09.830 回答
0

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

于 2010-11-16T23:19:03.827 回答
0

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

问候,
马辛

于 2010-11-17T18:40:38.303 回答