Linux进程挂起问题的调试工具?

7

我有一个守护进程,用于进行配置管理。所有其他进程都应该与此守护进程交互以确保其正常运行。但是,在执行大型操作后,几个小时后,守护进程会出现2到3个小时的无响应状态。之后,它会恢复正常。

Linux进程挂起问题的调试工具?

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

3个回答

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

每个工具都可以提供一点信息,这些信息共同构成了问题的完整画面。

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


我认为ps ax不是检测忙循环的好工具,top在这方面做得更好。 - Dmitry Yudakov
当然,你是正确的。我倾向于将它们几乎总是并排使用,所以它们在我的脑海中混淆了。谢谢,我已经更新了答案。 - Peter Tillemans
嗨Peter,strace帮助我解决了挂起的问题。挂起是因为两个进程之间使用"flock()"进行文件锁定而导致死锁。非常感谢您的帮助。如果没有strace,找出进程为何挂起真的是一项不可能的任务。 - Niranjan
1
我很高兴我的回答有所帮助。您可以考虑接受答案,这样您的接受率就会提高,这使得其他人更愿意帮助您,当然我也能获得15分;-)。 - Peter Tillemans
@PeterTillemans,如果进程挂起,我该如何使用strace查看最后的系统调用呢?似乎strace只能在监听进程时显示正在进行的调用。 - Max Lobur
@MaxLobur,您可以使用-p选项将strace附加到正在运行的进程上。但是当它挂起时,很可能是在代码中的紧密循环或io调用中被阻塞,两者都不会显示任何输出。在这种情况下,需要使用调试器。 - Peter Tillemans

1

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


1
你也可以直接在命令行中使用 gdb /path/to/executable PID 来完成此操作。 - R Samuel Klatchko

0

有许多不同的方法可以实现:

  1. 监听UNIX域套接字,以处理状态请求。然后外部应用程序可以查询应用程序是否仍然正常运行。如果在一定的超时时间内没有得到响应,则可以假定被查询的应用程序已经死锁或已经停止运行。

  2. 定期触发具有预选路径的文件。外部应用程序可以查看文件的时间戳,如果它已过期,则可以假定该应用程序已经停止运行或死锁。

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

您可以使用forkwaitpid无缝地重新启动进程,如此答案所述。这不会消耗任何重要资源,因为操作系统将共享内存页面。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接