Java Eclipse条件断点-仅在其他断点之后
我正在调试一个执行大量方法调用的应用程序。例如,我想调试Java Eclipse条件断点-仅在其他断点之后,java,eclipse,debugging,breakpoints,Java,Eclipse,Debugging,Breakpoints,我正在调试一个执行大量方法调用的应用程序。例如,我想调试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();
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();
}
public void methodA()
{
//做了一些我想调试的讨厌的事情
}
公共静态void main(字符串[]args)
{
对于(inti=0;i您可以在eclipse中使用条件断点来处理基于变量值的条件
只要在方法a
上设置一个断点,当您到达该断点时,将第二个断点添加到方法B
并继续执行。如何
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?
}
public void methodA()
{
//做了一些我想调试的讨厌的事情
}
公共静态void main(字符串[]args)
{
对于(int i=0;iA),只需使用命中计数1000即可。
只有当methodA-inside-for循环不在某些条件下时,它才起作用
B)使用条件
将断点放在methodA中的第一条语句处。参考图
[这里methodA==测试,我把断点放在第14行]
右键单击断点并选择断点属性
选项并添加以下条件
StackTraceElement[]stacktrace=Thread.currentThread().getStackTrace();
StackTraceElement e=stacktrace[2];
返回(例如getLineNumber()==9);
这里9表示第二次调用methodA(或test)的行号。请在代码中找到相同的行号并更改此行号
检查javadoc的行号,而不是行号,您也可以使用方法名。也就是说,只有当它从函数xyz
调用时,才可以中断
C)等待日食氧气(4.7)
在eclipse的下一个版本中,JDT将提供断点上的触发点。因此,只有在断点x以前被命中时,才可以说命中断点y
使用此选项,您只能在给定方法流[stacktrace]上的断点上暂停
例如:只有在调用流为以下情况下,才能在断点上停止:
methodA()-->methodB()-->methodC()-->methodD()
未打开
methodA()-->methodC()-->methodD()
等
有关更多详细信息,请参阅此。将您的评论/建议添加到此错误。我使用系统属性来实现此目的
榜样
假设我们有这个类:
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");
}
}
请参见下面的GIF:
检查属性的断点
现在,我们将断点添加到methodA()
,同时添加一个条件。在条件中,我们首先获得set系统属性的值:
String p = System.getProperty("enable.methodA.breakpoint", "false");
然后,我们将其解析为布尔值并返回:
return Boolean.valueOf(p).booleanValue();
(请注意,默认值为“false”
,因此如果未设置属性,断点将不会暂停。)
在下面的GIF中选中此步骤:
跑步
现在,如果我们在调试模式下运行该类,则methodA()
处的书签只会在调用methodB()
后暂停:
再次禁用断点
如果methodA()
在methodB()
之后多次调用methodA()
,并且我们只想检查一次,我们最终可以取消设置属性。例如,假设我们的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();
}
}
当然,这只是一个简单的例子——天空是这个技巧的极限。然后我需要修改我的代码,以便能够使用带有值的变量。我不想这样做(如我的问题中所述),如果您的methodB()不更改任何变量,此解决方案不起作用。这就是我现在所做的,效率很低,因为我需要找到断点、启用断点、禁用断点等@RobAu如果每次执行只转换一次,则不需要太多努力。如果您多次执行,您希望Eclipse如何知道何时“恢复”到pre-方法B
状态?非常聪明的方法B!谢谢:D@RobAu编辑了我的答案并添加了一个方法。请检查。谢谢@Chandrayya,我期待它。该功能在Eclipse Oxygen中被称为“触发点”,它与这里描述的完全相同。谢谢你的提示!
public static void main(String[] args) {
for (int i = 0; i < 1000; i++) {
methodA();
}
methodB();
methodA();
for (int i = 0; i < 1000; i++) {
methodA();
}
}
String p =
System.getProperty("enable.methodA.breakpoint", "false");
System.setProperty("enable.methodA.breakpoint", "false");
return Boolean.valueOf(p).booleanValue();