1.1 gdb 调试工具常用命令
- list:展开调试的源代码,缩写 l;
- break:设置断点,缩写为 b;
- info break:查看断点信息,缩写为 i b
- delete:删除断点
- print:打印变量的值,缩写为 p;
- run:程序开始运行,缩写 r,在 r 后可以加入程序启动启动参数,程序运行到断点处暂停;
- step:单步调试,可以进入子函数,缩写为 s;
- next:单步调试,不进入子函数,缩写为 n;
- continue:程序继续运行,,到下一断点处暂停,缩写为 c;
- set args:设置运行参数
- show args:查看运行参数
- gdb attatch pid:加载运行中的进程进行调式
- dir dirname ... :指定源目录
- x/28hx ---:以十六进程输出内存块数据
- kill:停止调试
- 段错误调试:
- 通过 ulimit 命令查看一下系统是否配置支持了 dump core 的功能。通过 ulimit -c 或 ulimit -a,可以查看 core file 大小的配置的情况,如果为 0,则表示系统关闭了 dump core;可以通过 ulimit -c unlimited 来打开。若发生了段错误,但没有 core dump,是由于系统禁止 core 文件的生成。
- gdb [exec file] [core file] | gdb -c corefile execfile
- backtrace:查看堆栈信息,缩写为 bt,注意 run 到出错的地方后,运行此命令,可以查看到错误的地方
- frame 堆栈错误编号:切换到编号处堆栈
- 之后用 gdb 的通用调试命令查看参数等
1.2 例子
swap.c
#include <stdio.h> void swap(int *a, int *b);
void swap_error(int a, int b); int main(void)
{
int i = ;
int j = ; printf("i: %d, j: %d\n", i, j);
swap(&i, &j);
printf("i: %d, j: %d\n", i, j); return ;
} void swap(int *a, int *b)
{
int c = *a;
*a = *b;
*b = c;
} void swap_error(int a, int b)
{
int c = a;
a = b;
b = c;
}
编译出目标文件(.o 文件): gcc -c -g -Wall swap.c
编译出可执行文件:gcc -g -o app swap.o
运行:gdb app
运行 list 命令可以列出源码:
list 后可以加函数名,列出函数,如 list main、list swap
设置断点, break main(或者使用 break swap.c:main(或行号)) 和列出断点信息 info break,也可以通过 b 行号 设置断点
运行程序,run(r) 命令:
运行到下一行,next(n)命令:
打印 i 的值,print(p) i:
打印 i 的地址,p &i:
进入子函数,step(s)命令:
打印 a:
a 的值与 i 的地址一样,即 a = &i
删除断点,delete 断点标号: