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)
实际的无操作指令:
__asm nop
Run Code Online (Sandbox Code Playgroud)
也许您可以这样做:
#define BREAKPOINT __asm { int 3; }
Run Code Online (Sandbox Code Playgroud)
这将调用中断3,这是断点中断。这将在代码中设置一个断点,该断点将作为代码的一部分进行编译。
现在,如果您只想进行一些操作,则可以在其上设置一个断点,除了允许您在该行上断点外,它实际上什么也没做。我认为您必须对代码进行优化而不是一件事,因为您可以将已实现的NO_OP在优化打开的情况下通过优化的编译器从代码中进行优化。
另一点是,这似乎是一件很奇怪的事情。据我所知,通常在要查看的一行代码上设置一个断点。看看什么是变量状态,一次只行一行,等等。我真的看不到在程序中基本上没有意义的代码行上设置断点将如何帮助您调试任何东西。
在 msvc x64 上有一个内在的:
__nop();
Run Code Online (Sandbox Code Playgroud)
头文件:<intrin.h>
文档:https://learn.microsoft.com/en-us/cpp/intrinsics/nop? view=msvc-170
| 归档时间: |
|
| 查看次数: |
2008 次 |
| 最近记录: |