我正在尝试调试我用 gdb 编写的服务器,因为它在非常特定和罕见的条件下会出现段错误。
有什么方法可以让 gdb 在后台运行(通过安静或批处理模式?),跟随子进程(因为我的服务器是一个守护进程并与主 PID 分离)并自动转储核心和回溯(到指定文件) 一旦程序崩溃?
原文由 David Titarenco 发布,翻译遵循 CC BY-SA 4.0 许可协议
我正在尝试调试我用 gdb 编写的服务器,因为它在非常特定和罕见的条件下会出现段错误。
有什么方法可以让 gdb 在后台运行(通过安静或批处理模式?),跟随子进程(因为我的服务器是一个守护进程并与主 PID 分离)并自动转储核心和回溯(到指定文件) 一旦程序崩溃?
原文由 David Titarenco 发布,翻译遵循 CC BY-SA 4.0 许可协议
假设您有适当的权限,您可以将 gdb 附加到任何进程。您可以在命令行上执行此操作:
gdb /path/to/binary _pid_
或者在 gdb 中使用 attach 命令:
attach _pid_
因此,一旦您的守护程序启动,您可以使用这些技术中的任何一种来附加到您的守护程序运行的最终 PID。附加 gdb 会停止您正在跟踪的进程,因此您需要发出“继续”来重新启动它。
我不知道在程序崩溃时让 gdb 运行任意命令的直接方法。这是我能想到的一种解决方法:
handle SIGSEGV nostop
)原文由 R Samuel Klatchko 发布,翻译遵循 CC BY-SA 2.5 许可协议
7 回答5.3k 阅读
3 回答2k 阅读✓ 已解决
4 回答4k 阅读
2 回答3.9k 阅读✓ 已解决
2 回答5.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
为什么不在持久屏幕会话中以交互方式运行该过程?为什么调试时必须是守护进程?或者只是在屏幕会话中运行 gdb 并在它分叉后将其附加到正在运行的进程(例如 gdb /path/to/binary -p PID_of_binary)。