在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 nop
或System.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!