2010-01-12 134 views
7

我试图调试我用gdb编写的服务器,因为它在非常特殊和罕见的条件下发生了段错误。 (通过安静模式或批处理模式?),跟随孩子(因为我的服务器是一个守护进程并从主PID分离),并自动转储核心和回溯(到一个指定的文件)一旦程序崩溃?如何在后台对守护进程运行gdb?

+0

http:// stackoverflow。com/questions/17965/generate-a-core-dump-in-linux关于生成核心转储的SO帖子 – 2010-01-12 17:14:07

+0

@HassanSyed:http://vmlinux.org/jocke/mirror/www.objsw.com/docs/gdb_22.html是一个死链接。 – bgoodr 2015-12-19 20:21:15

回答

6

为什么不只是运行过程交互在持久屏幕会话?调试时为什么它必须是守护进程?或者在屏幕会话中运行gdb,并在分支后将其附加到正在运行的进程(例如gdb/path/to/binary -p PID_of_binary)。

+0

这实际上是一个好主意,不知道为什么我没有想到这一点:P感谢基础解决方案! – 2010-01-13 03:09:37

+0

+1用于tmux而不是屏幕 – lkraav 2011-01-13 16:24:35

1

我不是一个真正的gdb的专家,但两件事情浮现在脑海

  1. Tracepoints作为程序运行它可能给你必要的信息或
  2. 使用gdb的remote debugging facility调试程序,而它的运行作为守护进程。
3

首先,我会设置你的shell /环境给你一个核心转储。在bash:

ulimit -c unlimited 

一旦你拥有了核心转储,您可以使用gdb来检查堆栈跟踪:

gdb /path/to/app /path/to/core/file 
+2

请注意,拥有核心文件与在调试器下停止相同的进程不是一回事。核心文件不保留有关打开文件描述符或内存映射状态的信息。所以这并不总是一个有用的建议。 – 2010-01-12 19:22:11

+1

你不能调用程序中定义的函数。 – 2010-01-12 19:36:10

7

假设你有适当的权限,你可以让gdb连接到任何进程。与附加命令的gdb内

gdb /path/to/binary _pid_ 

或:你可以做它的命令行

attach _pid_ 

所以,一旦你的后台程序已经启动,您可以使用这些技术来连接到守护进程运行的最终PID。连接gdb会停止正在跟踪的进程,因此您需要发出“继续”来重新启动它。

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

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

你可能想看看桑巴如何促进调试;它有一个可配置的"panic action",可以挂起应用程序,通知开发者,产卵gdb等,并作为其信号处理程序的一部分运行。请参阅Samba源树中的lib/util/fault.c

相关问题