2011-09-05 141 views
5

多线程应用程序挂起并且不响应任何命令。我曾尝试下面的东西没有运气:如何在Linux中调试多线程挂起进程?

  1. 附加一个过程GDB(错误:(GDB)连接6026 附加到进程6026 ptrace的:操作不允许)
  2. gstack(gstack只是挂像)

有没有什么好的方法来调试这个过程?

+0

您是试图以root用户身份,还是以创建该进程的用户身份或以其他用户身份进行连接?你有没有尝试从gdb运行程序,直到它挂起的地步? –

+0

@Jonatha Leffler我在root中运行该进程,并使用相同的id将进程附加到gdb中。这不是前台进程,这是一个守护进程。 – Thangaraj

+0

好的;如果它以root身份运行,并且您尝试以root身份运行gdb,那么它不是简单的权限问题(但它可能很复杂)。总的来说,我要做的是在gdb中启动守护进程,使用'set follow-fork-mode'和'set fork-detach-mode'等选项。 –

回答

6

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

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

1

最有可能是其他人已经追踪这个过程。要了解谁在做什么,请查看proc文件系统。

cat /proc/6026/status|grep TracerPid 
+0

TracePid字段为零 – Thangaraj

+0

然后原因是有些别的 – ks1322