【问题标题】:How to debug a multithreaded hung process in Linux?如何在 Linux 中调试多线程挂起的进程?
【发布时间】:2011-09-05 07:09:37
【问题描述】:

多线程应用程序挂起并且没有响应任何命令。我尝试过以下事情,但没有运气:

  1. 将进程附加到 gdb(错误:(gdb)附加 6026 附加到进程 6026 ptrace:不允许操作。)
  2. gstack(gstack 就这样挂了)

有什么好的方法可以调试这个过程吗?

【问题讨论】:

  • 您是尝试以 root 身份,还是以创建进程的用户身份,或以其他用户身份附加?您是否尝试过在程序挂起之前从 gdb 运行程序?
  • @Jonatha Leffler 我在 root 中运行该进程,并使用相同的 id 在 gdb 中附加该进程。这不是前台进程,这是一个守护进程。
  • 好的;如果它以 root 身份运行并且您尝试以 root 身份运行 gdb,那么这不是一个简单的权限问题(但它可能是一个复杂的问题)。总的来说,我要做的是在 gdb 中启动守护进程,使用 set follow-fork-modeset fork-detach-mode 等选项。
  • @Jonatha Leffler 感谢您的建议,但现在问题出现了。我喜欢以某种方式调试这个过程。这个问题将来可能无法重现吧?
  • 您或其他人是否已经在跟踪 6026 进程?看this问题。

标签: c linux multithreading linux-kernel


【解决方案1】:

感谢您的所有回复。问题出在内核级别。我们使用了 echo t > /proc/sysrq-trigger,它将所有正在运行的进程的堆栈记录在 /var/log/messages 中。此堆栈跟踪有助于分析问题。

从堆栈跟踪中,文件系统代表应用程序进程向其他进程(处于失效状态)发布了一些等待事件,并无限期地等待响应。这会导致挂起状态。

【讨论】:

    【解决方案2】:

    很可能其他人已经在跟踪这个过程。要找出是谁在做的,请查看 proc 文件系统。

    cat /proc/6026/status|grep TracerPid
    

    【讨论】:

    • 那么原因有点别的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多