有没有办法转储堆栈跟踪而不在java中抛出异常?

问题

我正在考虑为我的Java应用程序创建一个调试工具。

我想知道是否有可能获得堆栈跟踪,就像Exception.printStackTrace()但没有实际抛出异常?

我的目标是,在任何给定的方法中,转储堆栈以查看方法调用者是谁。


#1 热门回答(186 赞)

是的,只需使用

Thread.dumpStack()

#2 热门回答(69 赞)

你还可以尝试使用Thread.getAllStackTraces()获取所有活动线程的堆栈跟踪映射。


#3 热门回答(34 赞)

如果你想只跟踪当前线程(而不是系统中的所有线程,如Ram的建议那样),请执行以下操作:

Thread.currentThread()。getStackTrace()

要查找呼叫者,请执行以下操作:

private String getCallingMethodName() {
    StackTraceElement callingFrame = Thread.currentThread().getStackTrace()[4];
    return callingFrame.getMethodName();
}

并从需要知道其调用者是谁的方法中调用该方法。但是,请注意:列表中调用帧的索引可能因JVM而异!这一切都取决于在生成跟踪之前getStackTrace中有多少个调用层。一个更强大的解决方案是获取跟踪,并迭代它以查找getCallingMethodName的帧,然后进一步向上找两个真正的调用者。