我面临这样一种情况,其中我让进程 X 执行一个命令(比如说/bin/ls
)。一旦进程 X 执行命令 ls 我想在ls
.
有没有办法做到这一点?
我可以想到两种方法来做到这一点。
最简单的是set follow-fork-mode child
每当创建新的新客户端进程时,GDB 都会调试子进程。但是,在这种模式下,您将无法再调试父进程。
在子进程(ls
上面提到的)中添加一些代码来等待一开始就说 SIGCONT 的信号。每当创建子进程时,将 GDB(新 GDB 实例)及其子进程的 PID 附加到它,发出信号 SIGCONT 以继续。
一个简单的解决方案可能是将有问题的二进制文件(由进程 X 调用)包装在一个小的 shell 脚本中,该脚本在调试会话中启动进程并应用预配置的断点。
您可以使用catch exec
[ 1 ] 停止exec
通话:
(gdb) catch exec
Catchpoint 1 (exec)
(gdb) r
Starting program: /tmp/a.out
process 7544 is executing new program: /bin/ls
Catchpoint 1 (exec'd /bin/ls), 0x00007ffff7ddfaf0 in _start () from /lib64/ld-linux-x86-64.so.2
然后,您可以使用新流程做任何您想做的事情。另请参阅dbrank0评论中的链接,了解各种与 fork 相关的选项。