使用gdb调试正在运行的守护程序

Vic*_*don 7 c linux gdb daemon

我正在开发一个作为守护进程运行的高流量网络C服务器应用程序.在某些情况下,应用程序崩溃(总是没有核心).我如何使用gdb调试正在运行的守护进程来查找生成SIGSEGV的位置?

解释性说明:

  1. 我知道如何使用attach命令将gdb附加到正在运行的进程

  2. 附加到过程后,它会停止.如果我运行然后"继续",如果程序没有崩溃,gdb仍然被阻止.如果我按CTRL-C,进程正在退出,我无法简单地分离gdb.

所以问题是:有没有办法在没有gdb被卡住的情况下继续这个过程但是如果进程没有崩溃就可以分离?

sco*_*ttt 7

尝试异步模式并" 继续& ":

保存下面的非stop.gdb

set target-async on
set pagination off
set non-stop on
Run Code Online (Sandbox Code Playgroud)

然后运行:

$ gdb -x non-top.gdb
(gdb) !pgrep YOUR-DAEMON
1234
(gdb) attach 1234
(gdb) continue -a &
(gdb)
Run Code Online (Sandbox Code Playgroud)


Bry*_*ier 3

此页面附加/分离表示该detach命令可以在gdb.

如果您想捕获应用程序中的分段错误,则必须从调试器运行该应用程序。然后,当捕获到信号时,您可以使用wherebt 查看应用程序的堆栈跟踪。当然,应用程序出现故障后就无法继续使用,那么如何恢复呢?如果您希望很快触发故障,则可以附加到正在运行的进程并再次在调试器中等待故障。

如果您想要在故障发生后进行堆栈跟踪,那么您确实需要一个核心文件,因为不会附加任何进程。现在,如果您的守护进程作为系统的一部分启动,则可能很难获得转储核心的配置,而且您可能不希望其他应用程序在各处留下核心转储。因此,我建议停止系统守护进程并在用户空间中重新启动它,然后您可以允许它转储核心。如果确实有必要将其作为系统的一部分启动,则查看守护进程的启动是否仅限于单个子 shell,并ulimit -c在该子 shell 中使用来为核心转储设置适当的最大大小。