目录
前言
本文介绍使用GDB调试多进程程序的linux指令,并进行相关示例的演示。
一、介绍
GDB是UNIX及UNIX-like下的调试工具。
一般来说,GDB主要帮助你完成下面四个方面的功能:
- 启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
- 可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
- 当程序被停住时,可以检查此时你的程序中所发生的事。
- 你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。
二、测试
2.1 测试代码
#include <stdio.h>
#include <unistd.h>
int main(int argc,char **argv)
{
pid_t pid;
printf("before fork\n");
pid = fork();
if(pid>0)
{
printf("This is father process\n");
printf("pid = %d\n",(int)pid);
printf("father after fork\n");
while(1)
{
sleep(1);
printf("father sleep\n");
}
}
else if(pid == 0)
{
printf("This is chiled process\n");
printf("pid = %d\n",(int)pid);
printf("child after fork\n");
while(1)
{
2.2 编译
使用gcc编译的时候注意加上"-g"
gcc -g -o fork_t fork_t.c
如果没有安装gdb,先安装一下。
apt install gdb
2.3 跟踪单个进程
2.3.1 使用start单步运行程序
start
2.3.2 单步调试
n
2.3.3 设置跟进子进程代码
set follow-fork-mode child
我们可以看到,GDB已经脱离父进程,只进行子进程的调试
2.4 跟踪多个进程
如果我们想同时调试父子进程
2.4.1 设置根据子进程代码
set follow-fork-mode child
2.4.2 设置默认跟踪多个进程
set detach-on-fork off
此命令默认为on,所以会默认只跟踪一个进程
我们设置完跟踪多个进程,继续单步运行,可以看到目前还是在跟踪子进程
2.4.3 获取进程列表信息
info inferiors
可以看到目前的*在子进程上。
2.4.4 切换跟踪进程
inferior 1
切换进程后,进行单步调试,我看可以看到GDB已经成功的跟踪了父进程啦!
三、总结
本文通过实践测试介绍了GDB调试的相关指令并进行了演示。