2010-06-14 52 views
4

我有一个进行配置管理的守护进程。所有其他进程都应该与这个守护进程交互以实现其功能。但是当我执行一个大动作时,在几个小时后,守护进程在2到3个小时内没有响应。并且2-3小时后它正常工作。为Linux进程挂起问题调试实用程序?

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

如何获得Linux进程挂起的点?

回答

1

一个选项是使用gdb并使用attach命令为了附加到正在运行的进程。您将需要加载包含可执行的有问题的符号(使用file命令)

+1

你也可以直接从'gdb/path/to/executable PID'的命令行执行此操作' – 2010-06-14 05:47:11

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

这些都可能给出一些信息,这些信息一起构成了问题的图片。

使用gdb时,在应用程序被阻止时触发核心转储可能很有用。然后你有一个静态快照,你可以在你的闲暇时使用验尸调试进行分析。你可以让这些脚本触发它们。你快速建立一组快照,可以用来测试你的理论。

+0

我不认为'ps ax'是检测繁忙循环的好工具,'top'会更好这个 – 2010-06-14 06:11:45

+0

你当然是对的,我倾向于使用这些几乎总是并排的,所以他们混淆了我的脑海。谢谢,我更新了答案 – 2010-06-14 07:28:17

+0

嗨,彼得, strace帮助我解决了挂起问题。 挂起是因为使用'flock()'的文件锁定的两个进程之间的死锁场景。 非常感谢您的帮助。如果没有了解,那么找出这个过程为何悬而未决是一项不可能完成的任务。 – Niranjan 2010-06-17 09:18:05

0

有做了许多不同的方式:

  1. 监听一个UNIX域套接字,来处理状态请求。然后外部应用程序可以询问应用程序是否仍然正常。如果在某个超时期限内没有得到任何回应,那么可以认为被查询的应用程序已经死锁或者死机。

  2. 定期触摸具有预选路径的文件。外部应用程序可以查看该文件的时间戳,如果该文件已过时,则可以认为该应用程序已死或死锁。

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

,因为它与forkwaitpid死亡描述in this answer您可以无缝地重新启动过程。它不会花费任何重要的资源,因为操作系统将共享内存页面。