如何使用 gdb 调试多进程的C程序?

当父进程使用 fork 创建一个子进程时,此时我们会获得两个并行执行的进程,如果两个进程存在可复现的 bug,此时该如何调试呢?

参考:https://blog.csdn.net/lyc201219/article/details/129285463

=========================================方法1- set follow-fork
gdb调试器提供了一个follow-fork选项,通过set follow-fork mode设置一个进程fork出新的子进程时,gdb是继续调试父进程(取值是parent)还是继续调试子进程(取值是child),默认继续调试父进程(取值是parent)。

#fork 之后gdb attach到子进程
set follow-fork child
#fork之后gdb attach到父进程,这是默认值
set follow-fork parent

可以使用show follow-fork mode查看当前值
=========================================方法1-结束

=========================================方法2- gdb attach
先在一个Shell窗口中用gdb调试父进程,等子进程被fork出来后,再新开一个Shell窗口使用gdb attach命令将gdb attach到子进程上。

通常来说, gdb attach 需要 sudo 权限

操作方法如下:

sudo gdb
attach 

当要从 attach 的进程释放时,直接 quit 会杀死进程,若想不影响进程继续执行而退出 gdb,此时就需要使用

detach

detach 之后如果想要附着其它进程,需要重新载入符号表

attach 
file other-process-binary

该方法存在一个缺点,即程序已经启动了,我们只能使用gdb观察程序在这之后的行为,如果想调试程序从启动到运行的执行流程,则可能不太适用。

注:用gdb attach到进程后,加好断点,然后使用run命令重启进程,这样就可以调试程序从启动到运行的执行流程了。问题是这种方法并不通用,因为对于多进程服务模型,有些父子进程有一定的依赖关系,是不方便在运行过程中重启的。
=========================================方法2-结束

你可能感兴趣的:(服务器,linux,运维)