在java中有asm nop等价吗?

当我使用Visual Studio __asm nop; 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()替代方案?

在字节码中你有一个nop指令,但是Java语言中没有nop语句。

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

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

 assert true; 

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

事实certificate, assert true似乎并不会生成任何字节码指令,这会导致断言断言true被一起跳过。 然而,Eclipse可以打破诸如此类的声明

 assert Boolean.TRUE; 

这非常相似。

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

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

调试器很乐意打破这个。 因为t是块的本地,所以它不可能有任何副作用(并且将在生产代码中使JIT编译不存在)。

或者,您可以编写一个静态函数,其中包含一个永久设置的断点,因此您可以执行以下操作:

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

Java将此解释为空语句:

 ; 

虽然,如评论中所述,Eclipse不允许您在此处设置断点。 如果你想要一些无用的东西,你可以设置一个断点,这也很好,很容易打字,我建议:

 if(false){} 

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

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

  // Silly method that allows me to make noop private static void noop() { } public otherMethod() { // Here I need breakpoint noop(); } 

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

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

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

OS X上的右键单击菜单,底部有Breakpoint Properties “断点属性”对话框,显示命中数,条件等。