使用gdbdebugging正在运行的守护进程

我正在开发一个作为守护程序运行的高stream量networkingC服务器应用程序。 在某些情况下,应用程序崩溃(始终没有核心)。 我如何用gdbdebugging正在运行的守护进程以find生成SIGSEGV的地方?

解释性说明:

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

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

所以问题是:是否有办法继续进程没有gdb被卡住,但能够分离,如果进程没有崩溃?

Solutions Collecting From Web of "使用gdbdebugging正在运行的守护进程"

尝试异步模式和“ 继续 ”:

保存到非stop.gdb

 set target-async on set pagination off set non-stop on 

然后运行:

 $ gdb -x non-top.gdb (gdb) !pgrep YOUR-DAEMON 1234 (gdb) attach 1234 (gdb) continue -a & (gdb) 

这个页面attach / detach说detach命令可以在gdb里面工作。

如果要在应用程序中捕捉到分段错误,则必须从调试器运行应用程序。 然后当信号被捕获时,可以使用wherebt来查看应用程序的堆栈跟踪。 当然,在故障发生后你不能继续使用,应该怎么恢复? 如果您希望尽快触发故障,则可以附加到正在运行的进程并再次等待调试程序中的错误。

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