我们有一个系统(Red Hat Enterprise Linux Server 版本 6.6),偶尔会看到挂起的 java 进程(xalan 或 fop 转换)。
这些过程只是坐在那里,永远不会完成
在 /var/log/messages 中我找到这样的条目
abrt[33580]: Saved core dump of pid 48556 (/usr/bin/jdk1.6.0_06/bin/java) to /var/spool/abrt/ccpp-2017-06-01-08:52:40-48556 (341344256 bytes)
abrtd: Directory 'ccpp-2017-06-01-08:52:40-48556' creation detected
abrtd: Executable '/usr/bin/jdk1.6.0_06/bin/java' doesn't belong to any package and ProcessUnpackaged is set to 'no'
abrtd: 'post-create' on '/var/spool/abrt/ccpp-2017-06-01-08:52:40-48556' exited with 1
abrtd: Deleting problem directory '/var/spool/abrt/ccpp-2017-06-01-08:52:40-48556'
- abrt 可以用来收集有关问题的额外信息吗?
- 将 ProcessUnpackaged 更改为 yes 有用吗?
答案1
如果进程是aborted
或有一个coredump
,它将不再存在于内存中。因此,如果您认为某个进程挂起,请获取pid
该进程的信息,然后运行以下命令:
strace -fp <pid> -o strace.out
-- 对于指出进程可能挂起的系统调用很有用(请参阅输出文件 strace.out)。
pstree -aAp <pid>
-- 显示程序当前执行的行。
/usr/bin/gdb -q -p <pid> -- to see the current state of the process.
如果你有coredump
可用的,你可以用来gdb
分析它。
/usr/bin/gdb <java_binary_path> <coredump_path>
在gdb
控制台上使用:
(gdb) bt
(gdb) thread apply all bt