Java 递归函数的第一个条目上的断点

Java 递归函数的第一个条目上的断点,java,eclipse,recursion,breakpoints,conditional-breakpoint,Java,Eclipse,Recursion,Breakpoints,Conditional Breakpoint,是否可以创建一个断点,条件是它是递归过程的开始?换句话说,堆栈应该只有一个函数调用 I.考虑这个工作流程: Main func->call recursive func->hit breakpoint->continue->recursive call self->not hit breakpoint->continue recursive.您需要在递归函数中添加一个参数,该参数的任务是跟踪递归的深度。执行递归调用时,传入当前深度值加上一,这样每次调用时它都会递增。然后根据深度==1设置断点。

是否可以创建一个断点,条件是它是递归过程的开始?换句话说,堆栈应该只有一个函数调用

I.考虑这个工作流程:


Main func->call recursive func->hit breakpoint->continue->recursive call self->not hit breakpoint->continue recursive.

您需要在递归函数中添加一个参数,该参数的任务是跟踪递归的深度。执行递归调用时,传入当前深度值加上一,这样每次调用时它都会递增。然后根据深度==1设置断点。类似于以下内容(阶乘示例):

publicstaticint-fact(int-n,int-depth)
{
如果(n试试这个:

if(!Thread.currentThread().getStackTrace()[2].getMethodName().equals("this method's name"))
     // breakpoint

这是因为getStackTrace将返回实际的getStackTrace方法作为堆栈的一部分,返回方法名,然后返回调用方方法,这正是我们所需要的。

我不知道为什么要破坏代码以实现这一点,除非您以编程方式创建断点


将断点保留在递归函数中,然后右键单击断点并选择“断点属性”输入命中计数1。在第一次命中断点后,它将被禁用。

添加参数是不好的做法,因为它(1)需要清除(2)需要对调用该函数的任何人进行重构(这同样需要清理)。中断行被命中的次数只能在第一次使用。除非ide具有某些内置功能,否则这是解决该问题的唯一方法(即编写一些代码)。您希望得到什么样的解决方案?您可以单步通过调试器查看发生了什么,也可以临时编辑代码。添加这样的参数不会影响任何事情,而且会使函数更易于调试。这就是问题所在,它可能会影响一些事情。这是一个在许多地方使用的递归函数。您希望一般来说,避免更改参数。至于我所期望的,请看另一个解决方案。这正是我所期望的:断点的不引人注目的条件。添加这行代码更糟糕,因为它除了调试之外没有其他用途。添加深度参数要简单得多,并且有许多其他用途。如果您不想要中断接口,只需将代码移动到具有该参数的另一个方法中,并在原始方法中调用深度为0的新方法。您不是将该行添加到代码中,而是将其添加到一个条件断点中,该断点设计为在任何时候都不引人注目且可删除。我不确定您是否理解条件断点是如何工作的断点可以工作,请仔细阅读i:这不是我想要的。这只会在第一次从顶级调用递归函数时起作用。我希望每次从顶级调用函数时都能起作用。我可能没有说得足够清楚,对不起
if(!Thread.currentThread().getStackTrace()[2].getMethodName().equals("this method's name"))
     // breakpoint