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

新手上路,请多包涵

我正在尝试调试我用 gdb 编写的服务器,因为它在非常特定和罕见的条件下会出现段错误。

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

原文由 David Titarenco 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

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

原文由 Andy Ross 发布,翻译遵循 CC BY-SA 2.5 许可协议

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

 gdb /path/to/binary _pid_

或者在 gdb 中使用 attach 命令:

 attach _pid_

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

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

  1. 为 SIGSEGV 创建和注册信号处理程序。
  2. 告诉 gdb 不要停止该信号( handle SIGSEGV nostop
  3. 在信号处理程序的第一行设置断点。
  4. 命令分配给步骤 3 中的断点

原文由 R Samuel Klatchko 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题