我开发作为后台进程运行一个高流量的网络C服务器应用程序。 在某些情况下,应用程序崩溃(始终没有核心)。 如何调试使用gdb正在运行的后台程序,以发现产生SIGSEGV的地方吗?
解释性说明:
我知道如何用gdb使用attach命令附加到正在运行的进程
连接到过程之后,它停止。 如果我跑,然后“继续”,如果程序不崩溃GDB仍然受阻。 如果我按CTRL-C,该进程退出,我无法简单地分离GDB。
所以,问题是:有没有办法继续而不gdb的过程中被卡住,但能够分离,如果进程不崩溃?
我开发作为后台进程运行一个高流量的网络C服务器应用程序。 在某些情况下,应用程序崩溃(始终没有核心)。 如何调试使用gdb正在运行的后台程序,以发现产生SIGSEGV的地方吗?
解释性说明:
我知道如何用gdb使用attach命令附加到正在运行的进程
连接到过程之后,它停止。 如果我跑,然后“继续”,如果程序不崩溃GDB仍然受阻。 如果我按CTRL-C,该进程退出,我无法简单地分离GDB。
所以,问题是:有没有办法继续而不gdb的过程中被卡住,但能够分离,如果进程不崩溃?
尝试异步模式和“ 继续&”:
以下保存到非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)
此页面安装/拆卸说, detach
命令将内工作gdb
。
如果你想赶上分段故障在应用程序中,你将不得不从运行调试器应用程序。 然后,当信号被捕获,你可以使用where
或bt
来查看应用程序的堆栈跟踪。 当然,你不能继续应用后出现故障,应该如何恢复? 如果您希望在即将触发故障,您可以连接到正在运行的进程,并等待再次在调试器故障。
如果你想有一个堆栈跟踪发生故障后,那么你真的需要一个核心文件将不会有过程附加到。 现在,如果你的守护进程开始作为系统的一部分,它可能很难获取配置核心转储到,再加上你可能不希望其他应用程序离开核心转储所有的地方。 所以后来我的意见,停止系统守护进程,并在用户空间再次启动它,那么你就可以允许它进行核心转储。 如果是,它作为系统的一部分,启动真正重要的,然后看看守护进程的启动仅限于单个子壳和使用ulimit -c
在子shell来设置适当的最大尺寸核心转储。