如何在C++中的空语句上设置断点?

dog*_*wgm 16 c++ debugging visual-studio-2010

具体来说,我想写一个宏

1)允许我设置断点
2)什么都不做
3)导致没有编译器警告

#define NO_OP   ((void)0)

void main()
{
    bool b = true;
    if (b)
        NO_OP;  // I try to set a breakpoint here, but

}               // it jumps to here (in Visual Studio 2010)
Run Code Online (Sandbox Code Playgroud)

我也试过了

#define NO_OP   (assert(1))             // doesn't work
#define NO_OP   (sizeof(int))           // doesn't work
#define NO_OP   __asm{}                 // doesn't work
#define NO_OP   do {(void)0;} while(0)  // warning: conditional is constant
Run Code Online (Sandbox Code Playgroud)

到目前为止唯一有效的是令人畏缩的

#define NO_OP   { int x = 0; x = x; }
Run Code Online (Sandbox Code Playgroud)

一定有更好的方法.

编辑
谢谢Blorgbeard,__ asm {nop}确实有效.但我刚才意识到任何带有牙箍的东西都不够完美(有问题吗?)因为它留下了一个无用的分叉.(后来)我不知道对汇编程序的蹲坐,但是我试着去除括号,瞧!答案是:__ asm nop谢谢!


为了好奇以下是一个略显荒谬的例子:

string token = GetNextToken();
if (!Ignore(token))
{
    // process token
    DoThis(token);
    DoThat(token);
}
Run Code Online (Sandbox Code Playgroud)

这段代码是完整的 - 只要程序正常工作,我就不在乎忽略令牌.但是在任何给定的时间(并且不更改代码)我想确保我不拒绝好的代币

string token = GetNextToken();
if (Ignore(token))
{
    NO_OP; // set breakpoint here to monitor ignored tokens
}
else
{
    // process token
    DoThis(token);
    DoThat(token);
}
Run Code Online (Sandbox Code Playgroud)

Blo*_*ard 7

实际的无操作指令:

__asm nop
Run Code Online (Sandbox Code Playgroud)

  • 这是汇编的 MSVC 语法吗?在 GCC 中,它看起来必须是 `__asm("nop")`。 (3认同)

Ton*_*ion 5

也许您可以这样做:

#define BREAKPOINT __asm { int 3; }
Run Code Online (Sandbox Code Playgroud)

这将调用中断3,这是断点中断。这将在代码中设置一个断点,该断点将作为代码的一部分进行编译。

现在,如果您只想进行一些操作,则可以在其上设置一个断点,除了允许您在该行上断点外,它实际上什么也没做。我认为您必须对代码进行优化而不是一件事,因为您可以将已实现的NO_OP在优化打开的情况下通过优化的编译器从代码中进行优化。

另一点是,这似乎是一件很奇怪的事情。据我所知,通常在要查看的一行代码上设置一个断点。看看什么是变量状态,一次只行一行,等等。我真的看不到在程序中基本上没有意义的代码行上设置断点将如何帮助您调试任何东西。

  • 我认为“允许我设置断点”!=“无条件执行断点”。 (3认同)
  • 通常,调试器允许您指定在编译代码之后(以及在代码开始运行之后)执行断点的源代码行。您的建议将断点放入可执行文件中,而与调试器用户的工作无关。那些不是同一回事。 (3认同)

moj*_*mir 5

在 msvc x64 上有一个内在的:

__nop();
Run Code Online (Sandbox Code Playgroud)

头文件:<intrin.h>

文档:https://learn.microsoft.com/en-us/cpp/intrinsics/nop? view=msvc-170