在java中有asm nop等价吗?

时间:2012-05-24 11:05:55

标签: java debugging

当我使用Visual Studio编写C / C ++时,我经常使用__asm nop;命令插入 noop 代码,以便有一些东西可以打破。例如:

if (someCondition())
{
  __asm nop;
}

我不知道在条件发生时该怎么做,但我想停止执行并检查当前状态。有时候someCondition()很简单,可以创建一个条件断点,但条件断点会大大减慢执行速度,但并不总是可行。

现在,在C#中,我通过调用System.Diagnostics.Debugger.Break()System.Diagnostics.Debugger.Launch()直接进入调试器。

现在我被迫编写Java程序,直到现在我找不到比System.out.println("bla-bla")更好的替代方案并在那里设置断点。同样,请考虑条件断点不可行的情况。

所以,我想知道 - Java中有__asm nopSystem.Diagnostics.Debugger.Break()替代方案吗?

5 个答案:

答案 0 :(得分:34)

在字节码中,您有nop指令,但Java语言中没有nop语句。

您可以在一行上添加额外的;,代码仍然可以编译,但这并不比添加空行更有意义。

另一个“无所作为”的陈述可能是:

assert true;

没有任何副作用,可以在执行程序时关闭。

事实证明,assert true似乎没有生成任何字节码指令,这导致断言断言的真值被一起跳过。然而,Eclipse可以打破诸如

之类的声明
assert Boolean.TRUE;

非常相似。

答案 1 :(得分:6)

你可以放入任何不做任何事情的任意赋值语句,例如

if (someCondition()) {
  int t=0;
}

调试器很乐意打破此问题。由于t是块的本地,它不可能有任何副作用(并且将在生产代码中使JIT编译不存在)。

或者,您可以编写一个静态函数,其中包含一个永久设置的断点,因此您可以这样做:

if (someCondition()) {
  breakPoint();
}

答案 2 :(得分:4)

Java将此解释为空语句:

;

尽管如评论中所述,Eclipse不会让你在这里设置一个断点。如果你想要一些无用的东西你可以设置一个断点,这也很好且易于打字,我建议:

if(false){}

您的编译器可能会警告您永远不会输入此内容,这有助于提醒您在编译生产之前将其取出。希望这有帮助!

答案 3 :(得分:2)

我没有找到完美的解决方案,但这是我最喜欢的解决方案。可能效率不高但它可以让你设置一个断点,Eclipse不会抱怨或警告,从代码阅读器的角度来看,很明显你想要做什么。

    public otherMethod() { 
            // Here I need breakpoint
            if(someCondition())
                noop();
    }

如果我想预先设置断点,我将条件放在:

之前
{{1}}

答案 4 :(得分:2)

我将此分成一个新答案,因为我很惊讶没有人说过这个。 现代IDE允许您为断点添加逻辑!不是仅为调试编译专用的if语句,而是将断点放在您真正关心的位置,然后右键单击它并选择断点属性!

The right-click menu on OS X, with Breakpoint Properties at the bottom The Breakpoint Properties dialog, showing hit count, conditions, etc.