【发布时间】:2021-02-24 20:06:41
【问题描述】:
我使用如下命令在后台启动一个 gdb 会话:
gdb --batch --command=/tmp/my_automated_breakpoints.gdb -p pid_of_proces> &> /tmp/gdb-results.log &
最后的& 让它在后台运行(随后shell 立即关闭,因为此命令由单个ssh 命令发出)。
我可以通过ps -aux | grep gdb 找到gdb 会话的pid。
但是:我如何才能优雅地将这个 gdb 会话从正在运行的进程中分离出来,就像我使用 (gdb) detach 命令在我面前有终端会话一样?
当我使用 kill -9 gdb_pid 终止 gdb 会话(而不是正在运行的进程本身)时,之后我在运行的程序中得到了不需要的 SIGABRTs。
重新启动服务对我来说太耗时了。
如果使用此自动化脚本成功调试会话,我可以在批处理脚本中使用分离命令。然而这不是我的情况:我想在会话期间出现一些错误时分离/退出正在运行的 gdb 会话,所以我想从另一个终端会话中手动优雅地分离 gdb。
【问题讨论】:
-
我假设您的批处理命令正在循环运行?否则它应该结束它的协议。如果是这种情况,一种解决方法是让循环定期检查文件的存在(或不存在)。如果检测到文件,则循环应退出并分离。然后通过创建(或删除)文件来“发出信号”gdb 将是一件简单的事情。
-
@kaylum 有趣的想法!但是,批处理命令只是挂在
continue中并等待断点与服务的操作相匹配。所以没有真正的循环,它只是在等待...... -
您能向我们展示来自 SIGABRT 的堆栈跟踪吗?据我所知,最坏的情况——GDB 不删除断点并且目标在分离后继续——将导致目标获得 SIGTRAP。