停止执行我的程序并转到调试器而不设置断点(Visual Studio / GCC和C ++)
-
07-07-2019 - |
题
前段时间我在SO上找到了有关此功能的信息,但该主题与 Visual Studio的隐藏功能(2005-2008)?,我再也找不到了。
我想使用这样的东西:
#ifdef DEBUG
#define break_here(condition) if (condition) ... // don't remember, what must be here
#else
#define break_here(condition) if (condition) return H_FAIL;
#endif
//...
hresult = do_something(...);
break_here(hresult != H_OK);
//...
var = do_other_thing(...);
break_here(var > MAX_VAR);
它必须表现得像一个错误的断点。这就像断言,但没有对话,更轻量级。
我不能在这里使用普通断点,因为我的模块是几个项目的一部分,可以在几个VS解决方案中进行编辑。这导致在一个解决方案中设置的断点在源代码中移位,当在其他解决方案中编辑代码时。
解决方案
查看 DebugBreak
导致在当前进程中发生断点异常。这允许调用线程通知调试器处理异常。
示例:
var = do_other_thing(...);
if (var > MAX_VAR)
DebugBreak();
其他提示
也许这应该有所帮助:如何添加Visual C ++中的条件断点
我忘了,我也需要ARM构建,其中一个不是在MS Visual Studio中编译的:)
此外,我最好不要在我的模块的库版本中链接其他代码。是否需要包含“winbase.h”。对于DebugBreak()是一个“坏事”它,更好的是有一些内在的。但这不是什么“坏事”,因为最终版本中没有断点:)
借助 crashmstr 的回答,我找到了 DebugBreak()的替代品。现在我使用以下结构:
#ifdef _DEBUG
#ifdef _MSC_VER
#ifdef _X86_
#define myDebugBreak { __asm { int 3 } }
#else
#define myDebugBreak { __debugbreak(); } // need <intrin.h>
#endif
#else
#define myDebugBreak { asm { trap } } // GCC/XCode ARM11 variant
#endif
#else
#define myDebugBreak
#endif
#define break_here(condition) if (condition) { myDebugBreak; return H_FAIL; }
不隶属于 StackOverflow