【问题标题】:Debugging a hung process调试挂起的进程
【发布时间】:2017-11-04 07:58:22
【问题描述】:

我正在尝试调试挂起的 java 进程。它对 jstats、jmap 等大多数 JDK 工具没有响应。

这是 strace 的输出:

$ sudo strace -p <pid>
futex(0x7f14bb42a9d0, FUTEX_WAIT, 6090, NULL <unfinished ...>

wchan 的输出:

$ sudo cat /proc/<pid>/wchan          
futex_wait_queue_me%  

$sudo strace -f -p <pid>
Process <pid> attached with 15 threads - interrupt to quit
[pid  6105] futex(0x7f14b40cb954, FUTEX_WAIT_PRIVATE, 1, NULL <unfinished ...>
[pid  6102] futex(0x7f14ba81e860, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid  6101] futex(0x7f14b408aa54, FUTEX_WAIT_PRIVATE, 43, NULL <unfinished ...>
[pid  6100] futex(0x7f14b4085f54, FUTEX_WAIT_PRIVATE, 43, NULL <unfinished ...>
[pid  6074] futex(0x7f14bb42a9d0, FUTEX_WAIT, 6090, NULL    

有关流程的其他重要信息:

  • 它在 cgexec 下运行。

需要有关如何找到此进程挂起问题的根本原因的指针。

【问题讨论】:

  • strace -f -p 显示什么?
  • @exussum 更新问题,输出 strace -f -p

标签: java debugging strace


【解决方案1】:

一种方法是进行线程转储并分析它是否存在死锁,查找阻塞的线程并确定它们被阻塞的资源。 如果是 Oracle 热点 VM,那么您可以运行其他几个实用程序来检查死锁检测。如果进程没有响应,您可以强制进程转储堆栈跟踪(线程转储)。 阅读有关 Oracle JVM 故障排除的更多信息。 https://docs.oracle.com/javase/7/docs/webnotes/tsg/TSG-VM/html/hangloop.html

【讨论】:

  • 如问题中所述,使用 jstack 的线程转储失败。另外,我不想终止该进程,因为这种挂起不容易重现
  • 你可以试试,kill -3 pid,它不会杀死进程。如果您的进程在 tanuki 之类的包装器中运行,它会将线程转储重定向到包装器日志,而不是控制台。如果您的服务器机器配置为将标准输出重定向到 dev/null,您也不会看到输出。
猜你喜欢
  • 1970-01-01
  • 2015-07-05
  • 2023-04-05
  • 1970-01-01
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 2016-11-18
相关资源
最近更新 更多