Eclipse 条件断点 - 仅在其他断点之后
Eclipse conditional breakpoint - only after other breakpoint
我正在调试一个执行大量方法调用的应用程序。例如,我想调试 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 中可以实现这样的功能吗?或者有更好的选择吗?
您可以在 eclipse 中为基于变量值的条件使用条件断点。
只需在 methodA
上放置一个断点,当您遇到该断点时,将您的第二个断点添加到 methodB
并继续执行。
怎么样?
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?
}
A) 只需将命中数设为 1000。
只有当 for 循环中的 methodA 不在某些条件下时,它才有效。
B) 使用条件
将断点放在methodA.Refer图像中的第一个语句
[这里methodA == test,我把断点放在第14行]
右键单击断点和select Breakpoint properties
选项并添加以下条件。
StackTraceElement[] stacktrace = Thread.currentThread().getStackTrace();
StackTraceElement e = stacktrace[2];
return (e.getLineNumber() == 9);
这里的 9 表示第二次调用 methodA(或测试)的行号 made.Find 在您的代码中相同并更改它。
检查 StackTraceElement 的 javadoc,您也可以使用方法名称代替行号。也就是说,只有当它从函数 xyz
.
调用时才能中断
C) 等待日食氧气 (4.7)
在下一版本的eclipse JDT 中将提供断点触发点。所以你可以说命中断点 y ONLY IF breakpoint x 之前被打过
有了这个,您可以仅在给定方法流 [stacktrace] 的断点处暂停。
例如:只有当调用流程为:
时,您才能在断点处停止
methodA() --> methodB() --> methodC() --> methodD()
未开启
methodA() --> methodC() --> methodD()
等
有关详细信息,请参阅此 bug。将您的 comments/suggestion 添加到此错误中。
我使用系统属性来实现。
例子
假设我们有这个 class:
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()
内暂停,所以条件将 return false
:
System.setProperty("enable.methodA.breakpoint", "true");
return false;
参见下面的 GIF:
检查 属性
的断点
现在,我们在 methodA()
上添加一个断点,也有一个条件。在condition中,我们先获取set system的值属性:
String p = System.getProperty("enable.methodA.breakpoint", "false");
然后,我们将其解析为布尔值,return它:
return Boolean.valueOf(p).booleanValue();
(注意默认值为"false"
,所以如果不设置属性,断点不会暂停。)
在下面的 GIF 中检查此步骤:
运行
现在,如果我们 运行 这个 class 在调试模式下,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();
当然,这只是一个简单的例子——这个技巧没有限制。
我正在调试一个执行大量方法调用的应用程序。例如,我想调试 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 中可以实现这样的功能吗?或者有更好的选择吗?
您可以在 eclipse 中为基于变量值的条件使用条件断点。
只需在 methodA
上放置一个断点,当您遇到该断点时,将您的第二个断点添加到 methodB
并继续执行。
怎么样?
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?
}
A) 只需将命中数设为 1000。
只有当 for 循环中的 methodA 不在某些条件下时,它才有效。
B) 使用条件
将断点放在methodA.Refer图像中的第一个语句
[这里methodA == test,我把断点放在第14行]
右键单击断点和select Breakpoint properties
选项并添加以下条件。
StackTraceElement[] stacktrace = Thread.currentThread().getStackTrace();
StackTraceElement e = stacktrace[2];
return (e.getLineNumber() == 9);
这里的 9 表示第二次调用 methodA(或测试)的行号 made.Find 在您的代码中相同并更改它。
检查 StackTraceElement 的 javadoc,您也可以使用方法名称代替行号。也就是说,只有当它从函数 xyz
.
C) 等待日食氧气 (4.7)
在下一版本的eclipse JDT 中将提供断点触发点。所以你可以说命中断点 y ONLY IF breakpoint x 之前被打过
有了这个,您可以仅在给定方法流 [stacktrace] 的断点处暂停。
例如:只有当调用流程为:
时,您才能在断点处停止methodA() --> methodB() --> methodC() --> methodD()
未开启
methodA() --> methodC() --> methodD()
等
有关详细信息,请参阅此 bug。将您的 comments/suggestion 添加到此错误中。
我使用系统属性来实现。
例子
假设我们有这个 class:
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()
内暂停,所以条件将 return false
:
System.setProperty("enable.methodA.breakpoint", "true");
return false;
参见下面的 GIF:
检查 属性
的断点现在,我们在 methodA()
上添加一个断点,也有一个条件。在condition中,我们先获取set system的值属性:
String p = System.getProperty("enable.methodA.breakpoint", "false");
然后,我们将其解析为布尔值,return它:
return Boolean.valueOf(p).booleanValue();
(注意默认值为"false"
,所以如果不设置属性,断点不会暂停。)
在下面的 GIF 中检查此步骤:
运行
现在,如果我们 运行 这个 class 在调试模式下,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();
当然,这只是一个简单的例子——这个技巧没有限制。