C 如何在Linux中调试多线程挂起进程?

C 如何在Linux中调试多线程挂起进程?,c,linux,multithreading,linux-kernel,C,Linux,Multithreading,Linux Kernel,多线程应用程序挂起,不响应任何命令。我试过以下几件事,但运气不好: 将进程附加到gdb(错误:(gdb)附加6026 附加到过程6026 ptrace:不允许操作。) gstack(gstack就这样挂着) 有什么好的方法来调试这个过程吗?很可能其他人已经在跟踪这个过程了。要找出谁在做这件事,请查看proc文件系统 cat /proc/6026/status|grep TracerPid 谢谢你的回复。问题是在内核级别。我们使用echo t>/proc/sysrq触发器,它将所有正在运行的进程

多线程应用程序挂起,不响应任何命令。我试过以下几件事,但运气不好:

  • 将进程附加到gdb(错误:(gdb)附加6026 附加到过程6026 ptrace:不允许操作。)
  • gstack(gstack就这样挂着)

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

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

    cat /proc/6026/status|grep TracerPid
    

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


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

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