Visual Studio - 可以是从代码调用的断点吗?

时间:2010-03-05 19:12:37

标签: c++ visual-studio debugging visual-c++ breakpoints

我有一个基于UnitTest ++的单元测试项目。我通常在代码的最后一行放置一个断点,以便在其中一个测试失败时我可以检查控制台:

  n = UnitTest::RunAllTests();
  if ( n != 0 )
  {
  // place breakpoint here    
    return n;
  }
  return n;

但每次我从SVN重新签出代码时,我都必须重新插入它。是否有可能 在某种程度上由编译器放置断点?:

      n = UnitTest::RunAllTests();
      if ( n != 0 )
      {
      // place breakpoint here    
#ifdef __MSVC__
        @!!!$$$??___BREAKPOINT;
#endif
        return n;
      }
      return n;

6 个答案:

答案 0 :(得分:58)

使用__debugbreak()内在函数(需要包含<intrin.h>)。

使用__debugbreak()比直接编写__asm { int 3 }更可取,因为在编译x64体系结构的代码时不允许内联汇编。

为了记录,在Linux和Mac上,使用GCC,我正在使用__builtin_trap()

答案 1 :(得分:18)

DebugBreak(void)

来自Winbase.h。

MSDN

答案 2 :(得分:9)

您可以在C或C ++中使用它

__asm
{
    int 3
}

答案 3 :(得分:3)

如果您正在使用VC6(是的,已过时但仍在某些地方/项目中使用),DebugBreak()将起作用,但您最终可能会陷入某个模糊的位置,深入了解Windows DLL,您必须从中行走堆叠回你的代码。

这就是我在MFC中使用ASSERT()或在“标准”代码中使用assert()的原因。

你的例子会这样:

n = UnitTest::RunAllTests();
ASSERT(n == 0);
//assert(n == 0);
return n;

如果您不需要结果并希望仅用于调试,您也可以

if(0 != UnitTest::RunAllTests())
{
    ASSERT(FALSE);
    //assert(false);
}

答案 4 :(得分:0)

如何使用Debug或Trace方法输出控制台信息。这可能是一种比依赖断点更好的方法。

答案 5 :(得分:0)

您多久检查一次SVN的项目?这通常是我每个项目只执行一次,或者当我重建我的PC时。

如果您还要检查项目文件,则应将断点存储在项目文件中。

我认为它在.suo文件中。如果你愿意的话,你也可以把它置于SVN控制之下,尽管我不愿意。