GDB调试基础学习之初步体验(一)

发布于:2022-11-01 ⋅ 阅读:(252) ⋅ 点赞:(0)

1、前言

研究了一下GDB的使用,记录一下调试过程,学习一部分记录一部分,欢迎一起学习交流

2、GDB获取/安装

我用的Ubuntu,执行sudo apt-get install gdb即可,使用gdb --version可以查看版本

3、调试

3.1 编译程序

先贴一下测试代码:

#include <stdio.h>

int State = 0;              //状态标识 0无效 就是啥都不干

void StepTest(int *pState)
{
    printf("-----StepTest 1-----\n");
    printf("-----StepTest 2-----\n");
    printf("-----StepTest 3-----\n");
    *pState = 0;            //状态置无效
}

int main()
{
    printf("-----start-----\n");
    
    while(1)
    {
        switch(State)
        {
            case 1:
                printf("-----Test1-----\n");
                State = 0;
                break;
            case 2:
                printf("-----Test2-----\n");
                State = 0;
                break;
            case 3:
                StepTest(&State);
                break;
            case 4:
                printf("EXE Set Break Over\n");
                State = 0;
                break;
            default:
                break;
        }
       
        if(State == 10) // 允许进入断点
        {
            printf("Set Break\n");
            // 断点设置在本行
            State = 4;
            printf("Set Break OK\n");
        }
    }
    
    return 0;
}

文件名test.c,编译的时候要指定-g选项启用gdb调试,编译命令:gcc -g test.c -o test

3.2 启动调试

执行./test发起测试程序:

另起一个终端窗口,执行ps -e查看test的PID,然后执行gdb -p PID命令启动gdb调试,注意gdb调试接入后程序会暂停

 3.2.1 查看变量值

使用  p 变量名  命令可以打印程序中的全局变量的值:

 3.2.2 修改变量值

使用set var 变量名=设定值 命令可以修改全局变量的值:

配合代码测试,set var State=1将状态量修改为1,执行where命令可以查看程序当前运行的位置,执行 c 命令让程序继续执行,此时可以看到状态量为1时代码的打印:

执行c命令之后程序一直在跑,在GDB处使用Ctrl+c发送信号的方式停下程序

3.2.3 设置断点

通过 b 断点行 命令可以设置断点,使用 i b 命令可以列出断点信息

配合代码进行测试,先将State值改为10,让程序可以跑进断点位置,然后执行c命令让程序继续跑起来,可以看到程序在断点处停止,然后执行命令c可以看待State = 4生效的打印:

 

3.2.4 单步调试

程序停止后使用 n 命令可以执行单步调试,配合程序进行调试,先执行b 29设置断点,然后将State值改为3,使用c命令让程序跑起来,程序跑到断点位置后执行n命令查看单步调试结果:

4、小结

本章写了一个小程序简单体验了一下GDB调试正在运行程序,使用到的几个命令简单总结一下:

命令 解释
p 变量名 打印变量值
set var 变量名=设定值

设置变量的值

c 让程序执行
b 行号 设置断点
i b 列出断点
n 单步调试

后续学习新内容再更新

本文含有隐藏内容,请 开通VIP 后查看