Linux系统编程(五)GDB调试
5.1 GDB 介绍
使用GDB调试程序 是Linux后台必须掌握的技能。GDB可以帮我们完成:
- 启动程序,可以按照自定义的要求随心所欲的运行程序
- 可让被调试的程序在所指定的调置的断点处停住(断点可以是条件表达式)
- 当程序被停住时,可以检查此时程序中所发生的事
- 可以改变程序,将一个 BUG 产生的影响修正从而测试其他 BUG
下面来介绍 GDB 的基本用法。调试准备工作:
- 关闭
-O优化选项,关闭编译器默认优化 - 打开
-g调试选项,在可执行文件中加入源代码信息 - 打开
-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;
}
- 编译程序并调试
gcc test.c -g -Wall -o test

-
设置参数
set args,并查看参数

-
gdb中查看代码list

显示指定行号list [行号],指定的行作为中间行显示

-
显示其他文件代码(以其他文件为例,可自行测试)

-
查看显示的行数

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/next | step over,向下执行一行代码(不会进入函数体) |
| s/step | step into, 向下单步调试(进入函数体) |
| finish | 跳出函数体 |
| p/print [变量名] | 打印变量名 |
| ptype [变量名] | 打印变量类型 |
| display [变量名] | 自动打印变量名 |
| i/info display | 查看自动变量 |
| undisplay [编号] | 不显示自动变量 |
| set var 变量名=变量值 | 循环中使用 |
| until [条件] | 跳出循环 |
本文详细介绍GDB调试器的基础使用方法,包括如何准备调试环境、查看代码、设置和管理断点,以及常用调试命令等。适合Linux系统编程人员快速上手。
2726

被折叠的 条评论
为什么被折叠?



