在java中有asm nop等价吗?

mar*_*ark 35 java debugging

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

if (someCondition())
{
  __asm nop;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

所以,我不知道-是有一个__asm nopSystem.Diagnostics.Debugger.Break()Java中的选择?

aio*_*obe 38

在字节码中,您有一条nop指令,但nopJava语言中没有语句.

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

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

assert true;
Run Code Online (Sandbox Code Playgroud)

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

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

assert Boolean.TRUE;
Run Code Online (Sandbox Code Playgroud)

这非常相似.

  • 还有一个好技巧是做一个dummy方法,到处用,在方法里放断点:http://stackoverflow.com/a/26172741/895245 (2认同)
  • 截至 2018 年,_Eclipse_ (4.7) 和 _IDEA_ (2017.3) 都不能在 `;` 上中断。 (2认同)

Sup*_*tar 8

Java 将其解释为空语句:

;
Run Code Online (Sandbox Code Playgroud)

不过,正如评论中所指出的,Eclipse 不会让您在此处设置断点。如果你想要一些无用的东西,你可以在上面放置一个断点,这也很好且易于输入,我建议:

if(false){}
Run Code Online (Sandbox Code Playgroud)

您的编译器可能会警告您从未输入过,这对于提醒您在编译生产之前将其取出很有用。希望这可以帮助!


mik*_*era 6

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

if (someCondition()) {
  int t=0;
}
Run Code Online (Sandbox Code Playgroud)

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

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

if (someCondition()) {
  breakPoint();
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为你不能在Eclipse中的`;`上设置一个断点. (4认同)
  • 或者只是添加运算符`;` (2认同)
  • 在其他 IDE 中你也不能,例如在 IntelliJ IDEA 中。 (2认同)