我使用如下命令在后台启动 gdb 会话:
gdb --batch --command=/tmp/my_automated_breakpoints.gdb -p pid_of_proces> &> /tmp/gdb-results.log &
Run Code Online (Sandbox Code Playgroud)
最后的&让它在后台运行(并且 shell 之后立即关闭,因为该命令是由单个ssh命令发出的)。
我可以通过找到会话pid的内容。gdbps -aux | grep gdb
但是:我怎样才能优雅地从正在运行的进程中分离这个 gdb 会话,就像我使用命令在我面前的终端会话一样(gdb) detach?
当我使用 终止 gdb 会话(而不是正在运行的进程本身)时kill -9 gdb_pid,我会SIGABRT在运行的程序中得到不需要的 s 。
对于我的目的来说,重新启动服务太耗时。
如果使用此自动化脚本成功进行调试会话,我可以在批处理脚本中使用分离命令。但这不是我的情况:当会话期间出现一些错误时,我想分离/退出正在运行的 gdb 会话,因此我想从另一个终端会话中手动优雅地分离 gdb。
如果您gdb在后台从终端 #1 运行该命令,则始终可以gdb通过运行该命令返回前台fg。然后,您只需按 CTRL+C 即可detach正常停止调试会话。
假设终端 #1 现在被其他东西占用并且您无法使用它,您可以SIGHUP向gdb进程发送信号以将其分离:
sudo kill -s SIGHUP $(pidof gdb)
Run Code Online (Sandbox Code Playgroud)
$(pidof gdb)(如果您有多个 gdb 实例,请将 替换为实际 PID)