如何获取正在运行的应用程序的 Java 调用堆栈

2022-09-02 23:55:14

我正在开发非常庞大的基于Java Web的应用程序。由于在开发时没有完成适当的日志记录,因此我很难放置断点并调试应用程序,因为我不知道执行顺序。在我执行一些操作后,是否有任何机制可以获得正在运行的java应用程序的完整调用堆栈。

我在网上搜索了很长时间,但无法找到具体的解决方案。如果有东西,请建议我。谢谢


答案 1

方法 1:从命令行(JDK 发行版的一部分)使用 jstack 实用程序。

方法2:将信号3发送到java进程,它将在stdout上转储堆栈跟踪。

方法 3: 从应用程序内调用 Thread.getAllStackTraces ():

public class StackTraceDumper
{
    public static dumpAllStackTraces ()
    {
        for (Map.Entry <Thread, StackTraceElement []> entry: 
            Thread.getAllStackTraces().entrySet ())
        {
            System.out.println (entry.getKey ().getName () + ":");
            for (StackTraceElement element: entry.getValue ())
                System.out.println ("\t" + element);
        }
    }
}

然后在需要转储堆栈跟踪的位置使用。StackTraceDumper.dumpAllStackTraces()


答案 2

Thread.dumpStack()将当前线程的堆栈跟踪输出到标准错误流。 返回所有实时线程的堆栈跟踪映射。 返回一个堆栈跟踪元素数组,该数组表示此线程的堆栈转储。Thread.getAllStackTraces()Thread.getStackTrace()