如何获取正在运行的应用程序的 Java 调用堆栈
我正在开发非常庞大的基于Java Web的应用程序。由于在开发时没有完成适当的日志记录,因此我很难放置断点并调试应用程序,因为我不知道执行顺序。在我执行一些操作后,是否有任何机制可以获得正在运行的java应用程序的完整调用堆栈。
我在网上搜索了很长时间,但无法找到具体的解决方案。如果有东西,请建议我。谢谢
我正在开发非常庞大的基于Java Web的应用程序。由于在开发时没有完成适当的日志记录,因此我很难放置断点并调试应用程序,因为我不知道执行顺序。在我执行一些操作后,是否有任何机制可以获得正在运行的java应用程序的完整调用堆栈。
我在网上搜索了很长时间,但无法找到具体的解决方案。如果有东西,请建议我。谢谢
方法 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()
Thread.dumpStack()
将当前线程的堆栈跟踪输出到标准错误流。 返回所有实时线程的堆栈跟踪映射。 返回一个堆栈跟踪元素数组,该数组表示此线程的堆栈转储。Thread.getAllStackTraces()
Thread.getStackTrace()