eclipse - 当方法在 Eclipse 调试器中返回 null 时中断

标签 eclipse debugging conditional-breakpoint

我正在开发一个表达式评估器。有一个 evaluate() 函数,根据处理的表达式的复杂性,该函数会被调用多次。

我需要中断并调查此方法何时返回 null。有很多路径和返回语句。

可以在退出方法事件上中断,但我找不到如何设置有关返回值的条件。

最佳答案

我也陷入了这种沮丧之中。人们可以检查(并编写条件)命名变量,但不能检查返回值等未命名的内容。这里有一些想法(对于任何可能感兴趣的人):

  1. 可以在断点条件中包含类似 evaluate() == null 的内容。执行的测试(Eclipse 4.4)表明,在这种情况下,该函数将出于断点目的而再次执行,但这次断点禁用。所以你至少可以避免堆栈溢出的情况。 这是否有用,取决于所考虑的函数的性质 - 它会在断点时返回与运行时相同的值吗?(有些 s[a| i]要测试的简单代码:)
class TestBreakpoint {
    int counter = 0;
    boolean eval() { /* <== breakpoint here, [x]on exit, [x]condition: eval()==false */
        System.out.println("Iteration " + ++counter);
        return true;
    }
    public static void main(String[] args) {
        TestBreakpoint app = new TestBreakpoint();
        System.out.println("STARTED");
        app.eval();
        System.out.println("STOPPED");
    }
}
// RESULTS:
// Normal run: shows 1 iteration of eval()
// Debug run: shows 2 iterations of eval(), no stack overflow, no stop on breakpoint
  • 另一种使其更容易(将来可能进行调试)的方法是采用编码约定(或个人编码风格),要求人们声明本地在函数内部设置的变量,最后只返回一次。例如:
  • public MyType evaluate() {
        MyType result = null;
        if (conditionA) result = new MyType('A');
        else if (conditionB) result = new MyType ('B');
        return result;
    }
    

    那么您至少可以使用 result == null 等条件设置退出断点。然而,我同意这对于简单的函数来说是不必要的冗长,与语言允许的流程有点相反,并且只能手动强制执行。 (就我个人而言,我有时确实会在更复杂的函数中使用此约定(名称result“保留”仅用于此用途),它可能使事情变得更清晰,但不适用于简单的函数。但是很难划清界限;就在今天早上,我们不得不单步执行一个简单的函数,看看 3 种可能的情况中哪一个是被触发的。对于当今复杂的系统,人们希望避免单步执行。)

  • 除此之外,您需要根据具体情况修改代码,如上一点所示,以便单个函数将返回值分配给某个变量,您可以测试该变量。如果某些工作政策不允许您进行此类非功能性更改,那么您就会陷入困境......当然,如果原始代码有点复杂,这样的重写也可能导致无意中解决错误,所以谨防调试后恢复到原来的状态,却发现bug又回来了。
  • 关于eclipse - 当方法在 Eclipse 调试器中返回 null 时中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18977917/

    相关文章:

    .net - 当变量在 .NET 中获得特定值时,我可以设置断点吗?

    java - 如何从 Eclipse 以 super 用户身份运行我的应用程序?

    visual-studio-2008 - 使用VS2008完成调试Web应用程序后,为什么Internet Explorer关闭?

    c++ - 二维 vector 大小的 Visual Studio 2015 断点条件

    c# - 如何在 Visual Studio 中启用/禁用编译错误警告

    javascript - 行列式函数中的 NaN?

    android - Eclipse ADT 无法在 SDK 源上设置条件断点 : missing java Project context

    android - ICS 中的新 Android Calendar API 是否向后兼容?

    java - ,Eclipse 中的 JDK/JRE 集成

    eclipse - 使用 Eclipse 的 JDT,如何从类名中获取 IType?