如何在后台运行gdb对守护进程?

时间:2010-01-12 17:05:01

标签: c++ linux debugging unix gdb

我正在尝试调试我用gdb编写的服务器,因为它在非常特殊和罕见的条件下进行了段错误。

有什么方法可以让gdb在后台运行(通过安静或批处理模式?),跟随子项(因为我的服务器是守护进程并从主PID中分离)并自动转储核心和回溯(到一旦程序崩溃,指定的文件?

6 个答案:

答案 0 :(得分:8)

假设您具有适当的权限,则可以将gdb附加到任何进程。您可以在命令行上执行以下操作:

gdb /path/to/binary _pid_

或使用attach命令在gdb中:

attach _pid_

因此,一旦您的守护程序启动,您可以使用这些技术之一附加到您的守护程序正在运行的最终PID。附加gdb会停止正在跟踪的进程,因此您需要发出“continue”来重新启动它。

我不知道在程序崩溃时让gdb运行任意命令的直接方法。这是我能想到的一种解决方法:

  1. 为SIGSEGV创建并注册信号处理程序。
  2. 告诉gdb不要停止该信号(handle SIGSEGV nostop
  3. 在信号处理程序的第一行设置断点。
  4. 从第3步
  5. 分配commands to the breakpoint

答案 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专家,但有两件事情会浮现在脑海中

  1. Tracepoints可能会在您运行程序或
  2. 时为您提供必要的信息
  3. 使用gdb的remote debugging facility在程序作为守护程序运行时调试程序。

答案 5 :(得分:1)

您可能希望了解Samba如何促进调试;它有一个可配置的"panic action",可以暂停应用程序,通知开发人员,生成gdb等,并作为其信号处理程序的一部分运行。请参阅Samba源代码树中的lib/util/fault.c