43

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

if (someCondition())
{
  __asm nop;
}

我不知道发生这种情况时该怎么办,但我想停止执行并检查当前状态。有时someCondition()创建条件断点很简单,但条件断点会显着减慢执行速度,而且并非总是可行。

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

现在我被迫对 Java 进行编程,直到现在我还没有找到比在System.out.println("bla-bla")那里设置断点更好的选择。同样,请考虑条件断点不可行的情况。

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

4

5 回答 5

51

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

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

另一个“什么都不做”的声明可能是:

assert true;

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

事实证明,assert true似乎没有生成任何字节码指令,这会导致 assert true 上的断点一起被跳过。然而,Eclipse 能够打破诸如

assert Boolean.TRUE;

这是非常相似的。

于 2012-05-24T11:07:32.497 回答
9

Java 将其解释为空语句:

;

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

if(false){}

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

于 2015-02-03T16:48:03.837 回答
7

您可以放入任何不执行任何操作的任意赋值语句,例如

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

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

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

if (someCondition()) {
  breakPoint();
}
于 2012-05-24T11:14:48.113 回答
4

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

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

于 2015-07-27T13:35:31.600 回答
3

我没有找到完美的解决方案,但这是我最喜欢的解决方案。可能效率不高,但它允许您放置断点,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();
}
于 2015-05-06T08:46:26.167 回答