Linux下多进程的调试

Linux下多进程的调试:

(1)follow-fork-mode

set follow-fork-mode [parent | child] ———— fork之后选择调试父进程还是子进程

(parent: fork之后继续调试父进程;child: fork之后调试父进程。默认的是fork之后调试父进程)

set detach-on-fork [on | off] ———— 指示gdb在fork之后是否断开某个进程的调试,或交由gdb控制

(on: 断开调试follow-fork-mode指定的进程;off: gdb将控制父进程和子进程,follow-fork-mode指定的进程将被调试,另一个进程置于暂停状态)

(2)attach pid

Ubuntu下gdb要使用attach pid权限是不够的,需要切换到root,或者你可以sudo chmod +s /usr/bin/gdb给gdb添加权限。

使用attach需要在父子进程代码最开始添加sleep()语句,让进程睡眠,之后在后台运行进程,通过ps获取子进程pid,最后attach pid进入调试子进程。

eg:

$./test &            //使进程test在后台运行

$ps -ef | grep test        //查看进程pid

结果中类似下面的形式:

XXX 12345 23456 ———————————————— ./test        //父进程

XXX 12346 12345 ———————————————— ./test        //子进程,这里的第一个数字就是子进程pid

$ gdb -q test

(gdb)attach 12346        //attach到子进程

添加的sleep()可以是类似这样的语句:

while(pause)        //pause是一个标志变量

sleep(1);

在gdb调试时你只需要set pause=0使条件不满足即可执行后续代码。

(3)gdb wrapper

当父进程fork出子进程,子进程会紧接着调用exec函数来执行新的代码,这时也可以用gdb wrapper。它的优点是不用添加额外代码。

Linux下将一个进程放到后台运行:

(1)./test &

(2)"./test" 之后按下 "ctrl+z" , 用"bg %num"返回的数字将该进程放到后台;

Linux下将进程拉回前台:

用"fg %num"

GDB调试程序用法

GDB+GDBserver无源码调试Android 动态链接库的技巧

使用hello-gl2建立ndk-GDB环境(有源码和无源码调试环境)

在Ubuntu上用GDB调试printf源码

Linux下用GDB调试可加载模块

Ubuntu下使用GDB断点Go程序

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/4afb15bf06640e46d6c9ef1e28ef49d8.html