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