Linux系统编程(五)GDB调试

本文详细介绍GDB调试器的基础使用方法,包括如何准备调试环境、查看代码、设置和管理断点,以及常用调试命令等。适合Linux系统编程人员快速上手。

5.1 GDB 介绍

使用GDB调试程序 是Linux后台必须掌握的技能。GDB可以帮我们完成:

  1. 启动程序,可以按照自定义的要求随心所欲的运行程序
  2. 可让被调试的程序在所指定的调置的断点处停住(断点可以是条件表达式)
  3. 当程序被停住时,可以检查此时程序中所发生的事
  4. 可以改变程序,将一个 BUG 产生的影响修正从而测试其他 BUG

下面来介绍 GDB 的基本用法。调试准备工作:

  1. 关闭 -O 优化选项,关闭编译器默认优化
  2. 打开 -g 调试选项,在可执行文件中加入源代码信息
  3. 打开 -Wall 警告选项,避免一些不必要的 bug
gcc -g -Wall file.c -o file

5.2 GDB查看代码相关命令

GDB 常用的静态调试,即查看代码,命令如下表所示:

命令用法
gdb启动gdb
quit退出gdb
set args [arg1] [arg2] …设置参数
show args显示参数
list / l从默认位置查看当前文件代码
list / l [行号]从指定行号显示代码
list / l [函数名]从指定函数显示代码
list / l [文件名]:[行号]查看非当前文件的指定行代码
list / l [文件名] : [函数名]查看非当前文件的指定函数代码
show list / listsize查看显示的行数
set list / listsize 行数设置显示的行数
help查看帮助

用程序来简单进行命令练习,下面的 test.c

#include <stdio.h>
#include <stdlib.h>

int test(int a);

int main(int argc, char* argv[]) {
    int a, b;
    printf("argc = %d\n", argc);

    if(argc < 3) {
        a = 10;
        b = 30;
    } else {
        a = atoi(argv[1]);
        b = atoi(argv[2]);
    }
    printf("a = %d, b = %d\n", a, b);
    printf("a + b = %d\n", a + b);

    for(int i = 0; i < a; ++i) {
        printf("i = %d\n", i);
        // 函数调用
        int res = test(i);
        printf("res value: %d\n", res);
    }

    printf("THE END !!!\n");
    return 0;
}

int test(int a) {
    int num = 0;
    for(int i = 0; i < a; ++i) {
        num += i;
    }
    return num;
}

  1. 编译程序并调试
gcc test.c -g -Wall -o test

编译

  1. 设置参数 set args ,并查看参数
    参数

  2. gdb 中查看代码list
    list
    显示指定行号 list [行号] ,指定的行作为中间行显示
    指定行号

  3. 显示其他文件代码(以其他文件为例,可自行测试)
    在这里插入图片描述

  4. 查看显示的行数
    显示行数

5.3 GDB断点相关命令

GDB 对可执行文件下断点,命令如下表所示:

命令用途
b/break [行号]在文件的指定行下断点
b/break [函数名]在文件的指定函数入口下断点
b/break [文件名]:[行号]在指定文件的指定行下断点
b/break [文件名]:[函数名]在指定文件的指定函数入口下断点
i/info b/break查看断点
d/del/delete [断点编号]删除指定断点
dis/disable [断点编号]设置断点无效
en/enable [断点编号]设置断点生效
b/break [行号] [条件]设置条件断点

5.4 GDB 调试命令

命令用途
start程序开始执行,停在第一行
run遇到断点停止执行
c/contuine程序继续执行,直至下一个断点
n/nextstep over,向下执行一行代码(不会进入函数体)
s/stepstep into, 向下单步调试(进入函数体)
finish跳出函数体
p/print [变量名]打印变量名
ptype [变量名]打印变量类型
display [变量名]自动打印变量名
i/info display查看自动变量
undisplay [编号]不显示自动变量
set var 变量名=变量值循环中使用
until [条件]跳出循环
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值