【问题标题】:How to print stack trace of a thread (with thread id) via bash command?如何通过 bash 命令打印线程的堆栈跟踪(带有线程 id)?
【发布时间】:2018-03-12 23:15:23
【问题描述】:

我会尝试监视在线程上执行的操作,例如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 已知的线程的堆栈跟踪。

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

【问题讨论】:

  • 好吧,我假设您已经在文件 stack_trace.txt 中拥有您需要的信息,所以再挖掘一下,然后您就会得到答案:)
  • @KrassiEm 该文件中已经存在。但是活动线程的数量太大 - 它只是获取当前在 java 进程下运行的所有线程......所以,如果我可以单独获取当前线程的堆栈跟踪或实时堆栈跟踪,那将是一个很大的解脱(就像尾巴一样) - 进行积极的变化..
  • 您能否在 github 上发布文件示例,前提是您允许。似乎一旦文件在那里,应该使用一些正则表达式解析来提取您需要的东西。我确信一些 grep、awk、perl 代码距离解决方案只有一步之遥。

标签: multithreading bash stack-trace jstack printstacktrace


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多