如何获取正在运行的应用程序的Java Call Stack

sns*_*sns 14 java debugging callstack

我正在研究非常庞大的基于Java web的应用程序.由于在开发过程中没有进行适当的日志记录,因此我很难设置断点并调试应用程序,因为我不知道执行顺序.在执行某些操作后,是否有任何机制可以获取正在运行的java应用程序的完整Call Stack.

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

Mik*_*rov 19

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

方法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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Dew*_*wfy 6

Thread.dumpStack() 将当前线程的堆栈跟踪打印到标准错误流. Thread.getAllStackTraces() 返回所有活动线程的堆栈跟踪映射. Thread.getStackTrace() 返回表示此线程的堆栈转储的堆栈跟踪元素数组.


Gra*_*and 5

看看Throwable.getStackTrace().只需创建一个新的Throwable; 你真的不需要throw它.