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