我正在调试一个执行大量方法调用的应用程序。我想,例如,调试methodA
。它被称为1000次。
但是,在我的主循环中,我只想在几个语句之后开始调试方法A.
public void methodA()
{
//does something nasty that I want to debug
}
public static void main( String[] args )
{
for (int i=0; i<1000; i++)
{
methodA();
}
methodB();
methodA();
}
我希望仅在调用 methodA
之后才开始进入methodB
。我真的不想更改我的代码(例如,插入boolean
值并使断点以boolean
为条件。
Eclipse中是否可以这样?或者有更好的选择吗?
答案 0 :(得分:8)
A)只需将点击次数设为1000。
仅当for循环中的methodA不在某些条件下时才有效。
B)使用条件
将断点放在methodA.Refer image
中的第一个语句处[此处方法A ==测试我在第14行设置断点]
右键单击断点并选择Breakpoint properties
选项并添加以下条件。
StackTraceElement[] stacktrace = Thread.currentThread().getStackTrace();
StackTraceElement e = stacktrace[2];
return (e.getLineNumber() == 9);
这里9表示第二次调用methodA(或test)的行号。在代码中找出它并更改它。
检查StackTraceElement的javadoc,而不是行号,您也可以使用方法名称。即只有在从函数xyz
调用时才能中断。
C)等待日食氧气(4.7)
在Eclipse的下一个版本中,JDT将在断点上提供触发点。所以你可以说点击断点 y 只有在之前点击了断点 x 。
使用此功能,您只能在给定的方法流[stacktrace]上暂停断点。
例如:只有在呼叫流程为:
时才能在断点处停止 methodA() --> methodB() --> methodC() --> methodD()
不在
methodA() --> methodC() --> methodD()
等。
有关详细信息,请参阅此bug。将您的意见/建议添加到此错误中。
答案 1 :(得分:3)
我使用系统属性来实现这一点。
假设我们有这个课程:
public class Main {
public static void main(String[] args) {
for (int i = 0; i < 1000; i++) {
methodA();
}
methodB();
methodA();
}
private static void methodA() {
System.out.println("A");
}
private static void methodB() {
System.out.println("B");
}
}
我们想在methodA()
内添加断点,但只在调用methodB()
后停止,但不向代码添加额外的变量或使用计数器。
首先,让我们在methodB()
中添加一个断点并使其成为条件。在其条件下,我们将系统属性设置为true
。我们不想在methodB()
内暂停,因此条件将返回false
:
System.setProperty("enable.methodA.breakpoint", "true");
return false;
请参阅下面的GIF:
现在,我们向methodA()
添加一个断点,同时还有一个条件。在这种情况下,我们首先得到set系统属性的值:
String p = System.getProperty("enable.methodA.breakpoint", "false");
然后,我们将其解析为布尔值并返回它:
return Boolean.valueOf(p).booleanValue();
(请注意,默认值为"false"
,因此如果未设置属性,断点将不会暂停。)
在下面的GIF中检查此步骤:
现在,如果我们在调试模式下运行此类,methodA()
处的书签只会在调用methodB()
后暂停:
如果在methodA()
之后多次调用methodB()
并且我们只想检查一次,我们最终可以取消设置该属性。例如,假设我们的main()
方法现在就像这样:
public static void main(String[] args) {
for (int i = 0; i < 1000; i++) {
methodA();
}
methodB();
methodA();
for (int i = 0; i < 1000; i++) {
methodA();
}
}
我们可以使用这个条件,我们将属性设置为false,以避免再次在此断点处停止:
String p =
System.getProperty("enable.methodA.breakpoint", "false");
System.setProperty("enable.methodA.breakpoint", "false");
return Boolean.valueOf(p).booleanValue();
这当然只是一个简单的例子 - 天空是这个技巧的极限。
答案 2 :(得分:1)
您可以在eclipse中使用条件断点来获取基于变量值的条件。
答案 3 :(得分:0)
只需在methodA
上设置断点,当您点击该断点时,将第二个断点添加到methodB
并继续执行。
答案 4 :(得分:0)
怎么样?
public void methodA()
{
//does something nasty that I want to debug
}
public static void main( String[] args )
{
for (int i=0; i<1000; i++)
{
methodA();
}
methodB(); //first breakpoint here?
methodA(); //2nd breakpoint here?
}