我正在尝试调试我用gdb编写的服务器,因为它在非常特殊和罕见的条件下进行了段错误。
有什么方法可以让gdb在后台运行(通过安静或批处理模式?),跟随子项(因为我的服务器是守护进程并从主PID中分离)并自动转储核心和回溯(到一旦程序崩溃,指定的文件?
答案 0 :(得分:8)
假设您具有适当的权限,则可以将gdb附加到任何进程。您可以在命令行上执行以下操作:
gdb /path/to/binary _pid_
或使用attach命令在gdb中:
attach _pid_
因此,一旦您的守护程序启动,您可以使用这些技术之一附加到您的守护程序正在运行的最终PID。附加gdb会停止正在跟踪的进程,因此您需要发出“continue”来重新启动它。
我不知道在程序崩溃时让gdb运行任意命令的直接方法。这是我能想到的一种解决方法:
handle SIGSEGV nostop
)答案 1 :(得分:7)
为什么不在持久屏幕会话中以交互方式运行该进程?调试时为什么必须是守护进程?或者只是在屏幕会话中运行gdb并将其附加到正在运行的进程(例如gdb / path / to / binary -p PID_of_binary)之后。
答案 2 :(得分:3)
首先,我设置你的shell /环境给你一个核心转储。在bash:
ulimit -c unlimited
获得核心转储后,可以使用gdb检查堆栈跟踪:
gdb /path/to/app /path/to/core/file
答案 3 :(得分:2)
How to generate a stacktrace when my gcc C++ app crashes这个问题的答案应该做你想要的。 (假设您可以对代码进行更改)
答案 4 :(得分:1)
我不是真正的gdb专家,但有两件事情会浮现在脑海中
答案 5 :(得分:1)
您可能希望了解Samba如何促进调试;它有一个可配置的"panic action",可以暂停应用程序,通知开发人员,生成gdb等,并作为其信号处理程序的一部分运行。请参阅Samba源代码树中的lib/util/fault.c。