Linux进程的调试实用程序挂起问题?

时间:2010-06-14 05:36:00

标签: linux process hang

我有一个守护程序进程来执行配置管理。所有其他进程都应该与此守护进程交互以实现其功能。但是当我执行一个大动作时,几个小时后守护进程就会在2到3个小时内没有响应。并且在2-3小时后它正常工作。

调试Linux进程挂起问题的实用程序?

如何确定linux进程挂起的位置?

3 个答案:

答案 0 :(得分:9)

  • strace可以显示最后的系统调用及其结果
  • lsof可以显示打开的文件
  • 在写入日志消息以跟踪进度时,系统日志非常有效。允许在较小的区域中解决问题。还将日志消息与来自其他系统的其他消息相关联,这通常会产生有趣的结果
  • wireshark如果应用程序使用套接字使线缆可见。
  • ps ax + top可以显示您的应用是否处于繁忙的循环中,即在IO中一直运行,休眠或阻塞,消耗CPU,使用内存。

这些可能会提供一些信息,这些信息共同构成了问题的图景。

使用gdb时,在阻止应用程序时触发核心转储可能很有用。然后你有一个静态快照,你可以在闲暇时使用事后调试进行分析。您可以通过脚本触发这些操作。您可以快速构建一组快照,用于测试您的理论。

答案 1 :(得分:1)

一种选择是使用gdb并使用attach命令以附加到正在运行的进程。您需要加载包含相关可执行文件符号的文件(使用file命令)

答案 2 :(得分:0)

有许多不同的方法:

  1. 侦听UNIX域套接字,以处理状态请求。然后,外部应用程序可以查询应用程序是否仍然正常。如果在某个超时期限内没有响应,那么可以假设被查询的应用程序已经死锁或已经死亡。

  2. 定期触摸具有预选路径的文件。外部应用程序可以查看文件的时间戳,如果它是陈旧的,那么它可以假定应用已经死亡或死锁。

  3. 您可以重复使用alarm系统调用,让信号终止进程(相应地使用sigaction)。只要你一直打电话alarm(即只要你的程序正在运行)它就会继续运行。一旦你不这样做,信号就会激发。

  4. 您可以按照fork所述的waitpid和{{1}}无缝重启您的流程。它不需要任何重要资源,因为操作系统将共享内存页面。