Linux-如何用gdb调试多进程

本文介绍了GDB调试器的主要功能及其在多进程调试中的应用。通过设置特定参数,GDB能够有效地调试父进程和子进程,展示了如何利用GDB进行多进程调试的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前学习安装工具时,简单的学习使用了gdb调试器,但是还是很不熟悉,这次学习了如何用gdb调试多进程做一总结,并且复习一下之前的gdb调试。

gdb

gdb的功能?
主要功能
1、启动程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。

在用gdb调试前,编译时要加上-g选项,目的是为了生成调试信息。

gcc test.c -g

或者在Makefile中加上-g选项即可。

.PHONY:clean
test:test.c
    gcc -o $@ $^ -g
clean:
    rm -f test

常见gdb调试命令:


(gdb) start                         //开始调试
(gdb) n                             //一条一条执行
(gdb) step/s                        //执行下一条,如果函数进入函数
(gdb) backtrace/bt                  //查看函数调用栈帧
(gdb) info/i locals                 //查看当前栈帧局部变量
(gdb) frame/f                       //选择栈帧,再查看局部变量
(gdb) print/p                       //打印变量的值
(gdb) finish                        //运行到当前函数返回
(gdb) set var sum=0                 //修改变量值
(gdb) list/l 行号或函数名             //列出源码
(gdb) display/undisplay sum         //每次停下显示变量的值/取消跟踪
(gdb) break/b  行号或函数名           //设置断点
(gdb) continue/c                    //连续运行
(gdb) info/i breakpoints            //查看已经设置的断点
(gdb) delete breakpoints 2          //删除某个断点
(gdb) disable/enable breakpoints 3  //禁用/启用某个断点
(gdb) break 9 if sum != 0           //满足条件才激活断点
(gdb) run/r                         //重新从程序开头连续执行
(gdb) watch input[4]                //设置观察点
(gdb) info/i watchpoints            //查看设置的观察点
(gdb) x/7b input                    //打印存储器内容,b--每个字节一组,7--7组
(gdb) disassemble                   //反汇编当前函数或指定函数
(gdb) si                            // 一条指令一条指令调试 而 s 是一行一行代码
(gdb) info registers                // 显示所有寄存器的当前值
(gdb) x/20 $esp                    //查看内存中开始的20个数

对于简单的调式就不做演示,直接叙述如何用gdb调试多进程。

调试多进程

gdb是可以调试多进程和多线程的(以后会写到)
在默认情况下,gdb是只会调试主进程,即父进程。所以如果想要调试多进程则需要设置follow-fork-modedetach-on-fork
说明:

folloe-fork-modedetach-on-fork说明
parenton只调试主进程(GDB默认)
childon只调试子进程
parentoff同时调试两个进程,gdb跟主进程,子进程block在fork位置
childoff同时调试两个进程,gdb跟子进程,主进程block在fork位置

用一下命令可以查看当前设置值:
这里写图片描述
修改当前设置:

set follow-fork-mode [child|parent]
set detach-on-fork [on|off] 

这里写图片描述

调试父进程
测试用例:

int main()
{
    pid_t id=fork();
    if(id==0)
    {
        //child
       printf("i am child-->pid=%d,ppid=%d\n",getpid(),getppid());
       sleep(1);
    }
    else
    {
        //father
        printf("i am father-->pid=%d,ppid=%d\n",getpid(),getppid());
        sleep(1);
    }
    return 0;
}

这里写图片描述

同样的测试用例,再来调试子进程:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值