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

时间:2012-01-27 11:01:18

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

具体来说,我想写一个

的宏

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)

我也试过

#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

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

#define NO_OP   { int x = 0; x = x; }

必须有更好的方法。

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

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

string token = GetNextToken();
if (!Ignore(token))
{
    // process token
    DoThis(token);
    DoThat(token);
}

此代码已完成 - 只要程序正常运行,我就不关心忽略令牌的任何信息。但是在任何给定时间(并且不更改代码)我想确保我不拒绝好令牌

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

6 个答案:

答案 0 :(得分:6)

实际的无操作指令:

__asm nop

答案 1 :(得分:4)

也许你可以这样做:

#define BREAKPOINT __asm { int 3; }

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

现在,如果你只想要一些操作,你可以设置一个断点,除了允许你打破这一行之外什么都没做。我认为你必须在没有优化的情况下编译你的代码,因为你实现的NO_OP很可能通过优化编译器优化编译器优化,优化开关。

另一点是,这似乎是一件非常奇怪的事情。据我所知,人们通常会在想要查看的代码行上设置断点。查看变量状态是什么,一次一行,等等。我真的不明白如何在程序行中设置一个断点而在程序中没有任何意义,这将有助于你调试任何东西。

答案 2 :(得分:1)

__asm int 3怎么样?此外,是否启用了优化?这可能是其他人失败的原因(实际上从未试图打破它们)。

答案 3 :(得分:1)

C ++ 03:

inline void __dummy_function_for_NO_OP () {}
#define NO_OP __dummy_function_for_NO_OP ()

int main () {
    NO_OP;
}

C ++ 11:

#define NO_OP [](){}()

int main () {
    NO_OP;
}

答案 4 :(得分:1)

在msvc x64上有一个固有的:

__nop;

答案 5 :(得分:0)

您可以定义全局unsigned int debug_counter,然后您的“无操作”宏可以是debug_counter++。很确定编译器不会删除它,但绝对可以确定,在某处放置一些代码来打印计数器的值。