linux之gdb基本调试命令和使用总结
1、gdb调试命令
描述 | |
---|---|
backtrace(或bt) | 查看各级函数调用及参数 |
finish | 连续运行到当前函数返回为止,然后停下来等待命令 |
frame(或f) 帧编号 | 选择栈帧 |
info(或i) locals | 查看当前栈帧局部变量的值 |
list(或l) | 列出源代码,接着上次的位置往下列,每次列10行 |
list 行号 | 列出从第几行开始的源代码 |
list 函数名 | 列出某个函数的源代码 |
next(或n) | 执行下一行语句 |
print(或p) | 打印表达式的值,通过表达式可以修改变量的值或者调用函数 |
quit(或q) | 退出gdb 调试环境 |
set var | 修改变量的值 |
start | 开始执行程序,停在main 函数第一行语句前面等待命令 |
step(或s) | 执行下一行语句,如果有函数调用则进入到函数中 |
比如还有几个命令如下
wath 观察一个变量
current 跳转到下个断点,或则跳转到观察点
quit 退出gdb调试
二、分析例子
代码如下:
- #include <stdio.h>
- int add_range(int low, int high);
- int add (int a, int b);
- int add (int a, int b) {
- int result = a + b;
- return result;
- }
- int add_range(int low, int high)
- {
- int i = 0, sum = 0;
- for (i = low; i <= high; i++)
- sum = sum + i;
- return sum;
- }
- int main(void)
- {
- int result[100];
- result[0] = add_range(1, 10);
- result[1] = add_range(1, 100);
- printf("result[0]=%d\nresult[1]=%d\n", result[0], result[1]);
- int a = 9, b = 10;
- int result1 = a + b;
- int result2 = a * b;
- printf("result1 = %d, result2 = %d", result1, result2);
- int result3 = add(result1, result2) ;
- printf("result3=%d", result3);
- if (result3 == 10) {
- printf("result3 = %d", result3);
- } else {
- printf("result != 10");
- }
- return 0;
- }
在编译时要加上-g
选项,生成的可执行文件才能用gdb
进行源码级调试:
命令如下:
- gcc -g main.c -o hello1
- gdb hello1
如下图
然后我们怎么查看源代码呢?命令如下
- list 1
然后我们还要看下面的代码可以怎么样操作,你可以 回车 或则 输入l 之后回车(因为list 简写 l)注意很多gdb命令都可以简写成首字母,或则输入 list 2 回车也可以
我们退出gdb命令如下
- quit
我们这里先不退出
我们先运行程序用下面命令
- start
我们用next命令执行下一条语句,next命令简写为n,输入下民命令
- n
我们也可是使用step命令进入函数内入跟踪,简写命令s,再输入命令n执行下一步,输入下面命令
- s
在函数中有几种查看状态的办法,backtrace
命令(简写为bt
)可以查看函数调用的栈帧:
可见当前的add_range
函数是被main
函数调用的,main
传进来的参数是low=1, high=100
。main
函数的栈帧编号为1,add_range
的栈帧编号为0。现在可以用info
命令(简写为i
)查看add_range
函数局部变量的值:
i locals
如果想查看main
函数当前局部变量的值也可以做到,先用frame
命令(简写为f
)选择1号栈帧然后再查看局部变量:
(gdb) f 1
输入下面命令
- i locals
我们还可以用p打印出当前值
我们也可以修改sum的值
- set var sum = 0
比如我们不要运行这个函数了,要运行这个函数下面的程序,我们可以用finish
- finish
quit 退出命令
3、总结
我们熟悉了gdb基本的调试命令,然后下篇博客来讲gdb怎么打断点,怎么调试,怎么watch变量。