2009-09-15 42 views
3

我在前一段时间找到了关于此功能的信息,但主题是Hidden Features of Visual Studio (2005-2008)?的重复,再也找不到了。停止执行我的程序并转到调试器而没有设置断点(Visual Studio/GCC和C++)

我想用这样的:

#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解决方案中编辑。这导致在一个解决方案中设置的断点在源代码中的某处移动,而在其他解决方案中编辑代码时。

回答

9

看看DebugBreak

导致当前进程发生断点例外。这允许调用线程发信号通知调试器处理异常。

例如:

var = do_other_thing(...); 
if (var > MAX_VAR) 
     DebugBreak(); 
+0

谢谢!我发现它几秒前:)这很奇怪:我搜索了大约一个小时 - 没有发现。并且在询问问题后,在一分钟内找到正确答案:) – zxcat 2009-09-15 17:30:11

2

也许这对应该有所帮助:How to add a conditional breakpoint in Visual C++

+0

奇怪,但您的链接也包含正确的答案。我没有打开那个话题,因为它的标题听起来像其他的东西 - 真正的条件断点,而不是我需要的。 – zxcat 2009-09-15 17:32:16

2

我忘了,我需要ARM建立也和他们中的一个在MS Visual Studio中:)

未编译

此外,我最好不要链接模块的库版本中的其他代码。为DebugBreak()包含“winbase.h”的需要是它的一个“坏事”,最好是有一些固有的。但是,这是有点“坏事”,因为不会有断点在最终版本:)

随着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; } 
相关问题