如何通过bash命令打印线程的堆栈跟踪(带有线程ID)?

时间:2017-10-01 19:30:50

标签: multithreading bash stack-trace jstack printstacktrace

我会尝试监视在tail命令之类的线程上执行的操作。它应该打印线程的stackTrace(其线程ID已知)。

我可以打印当前在java进程下运行的所有线程的堆栈跟踪,如下所示

pid=$(ps -ef |grep 'catalina' | grep java | awk ' { print $2 } ');
eval '/home/jdk/bin/jstack -F $pid' > stack_trace.txt

但我需要打印其线程ID已知的线程的堆栈跟踪。

非常欢迎这方面的任何帮助。在此先感谢:)

1 个答案:

答案 0 :(得分:1)

你能试着看看下面是否适合你。

TARGET_THREAD_ID=xxx JAVA_PID=$(ps -ef | grep "[org].apache.catalina.startup.Bootstrap"  | awk '{print $2}'); jstack -F ${JAVA_PID} | sed -n -e "/Thread ${TARGET_THREAD_ID}/,/Thread /p" | head -n -1

将打印如下所示的内容

Thread xxx: (state = BLOCKED)
 - java.lang.Object.wait(long) @bci=0 (Compiled frame; information may be imprecise)
 - java.lang.Object.wait() @bci=2, line=502 (Compiled frame)
 - java.lang.ref.Reference.tryHandlePending(boolean) @bci=54, line=191 (Compiled frame)
 - java.lang.ref.Reference$ReferenceHandler.run() @bci=1, line=153 (Compiled frame)