【发布时间】:2013-04-16 15:33:40
【问题描述】:
我正在开发一个作为守护进程运行的高流量网络 C 服务器应用程序。在某些情况下,应用程序崩溃(总是没有核心)。如何使用 gdb 调试正在运行的守护程序以找到生成 SIGSEGV 的位置?
解释性说明:
我知道如何使用 gdb 将附加命令附加到正在运行的进程
附加到进程后,它会停止。如果我运行然后“继续”,如果程序没有崩溃,gdb 将保持阻塞状态。如果我按 CTRL-C,进程将退出,我无法简单地分离 gdb。
所以问题是:有没有办法在不卡住 gdb 的情况下继续进程,但如果进程没有崩溃则能够分离?
【问题讨论】:
-
您是否尝试过更改核心转储设置,例如
ulimit命令?和/或运行调试版本?或者可能添加更多日志记录以缩小崩溃的可能位置? -
我已经尝试了所有的可能性。该进程在 Ubuntu 服务器上作为新贵服务运行,并在服务启动时设置为特定用户。 limits.conf 包含该用户的 nofile 和 core 的无限值。我在 /etc/sysctl.conf 中设置了 fs.suid_dumpable 和 kernel.core_uses_pid 我添加了更多日志记录,但它是一个高流量服务器,它产生的输出太多。