【问题标题】:Visual Studio - can be a breakpoint called from code?Visual Studio - 可以是从代码调用的断点吗?
【发布时间】:2011-01-24 06:14:45
【问题描述】:

我有一个基于 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;

【问题讨论】:

  • 能否请您更改问题标题?这不仅仅是 Visual Studio 的问题,对其他编译器也很有趣。

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


【解决方案1】:

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

【讨论】:

  • UnitTest++ 框架执行输出。我插入语句,例如 CHECK(pi
【解决方案2】:

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

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

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

【讨论】:

  • 也许我遗漏了一些东西,但它是 __debugbreak() - 中间没有下划线。
【解决方案3】:

您多久从 SVN 签出项目?这通常是我每个项目或重建 PC 时只做一次的事情。

如果您还签入项目文件,则应将断点存储在项目文件中。

我认为它在 .suo 文件中。如果你愿意,你也可以将它置于 SVN 控制之下,虽然我不喜欢这样做。

【讨论】:

  • 尽可能多地确保所有新文件在提交之前都已添加并且没有任何依赖项丢失。将旧的构建目录保留在光盘上也很好,以便快速访问旧版本的二进制文件。
  • 好点。我们还进行冒烟测试构建,但我没有想到。
【解决方案4】:
DebugBreak(void)

来自 Winbase.h。

MSDN

【讨论】:

  • 关于DebugBreak__debugbreak 之间的区别,我想添加这个quote from MSDN因为DebugBreak 是对系统函数的调用,所以必须安装系统调试符号到确保中断后显示正确的调用堆栈信息。否则,调试器显示的调用堆栈信息可能会偏移一帧。如果使用 __debugbreak,则不需要符号。
【解决方案5】:

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

__asm
{
    int 3
}

【讨论】:

  • 仅适用于 x86,因为编译器不允许您为 x64 编写内联汇编
【解决方案6】:

如果您使用的是 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);
}

【讨论】:

    猜你喜欢
    • 2010-12-29
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    相关资源
    最近更新 更多