5

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

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

如何获得linux进程挂起的时间?

4

3 回答 3

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

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

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

于 2010-06-14T05:53:32.030 回答
1

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

于 2010-06-14T05:39:03.367 回答
0

有许多不同的方法可以做到:

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

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

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

您可以在进程终止时无缝地重新启动进程,forkwaitpid答案中所述。它不会花费任何大量资源,因为操作系统将共享内存页面。

于 2013-11-09T09:09:05.277 回答