一 单步执行和跟踪函数调用
先给出一段代码,可以用下面介绍的例子。
#include <stdio.h> int add_range(int low, int high) { int i, sum; 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 result[1]=%d ", result[0], result[1]); return 0; }
1. 在编译时要加上-g选项,生成的可执行文件才能用gdb进行源码级调试。
$ gcc -g main.c -o main
$ gdb main
当然在加-tui 在格式上会比较直观好看一些
$ gcc -g main.c -o main
$ gdb -tui main
gdb加-g编译时并不是把整个源文件嵌入到可执行文件中,所以在调试时必须保证gdb能找到源文件。
2. 帮助命令
(gdb) help
进一步查看某一类别中有哪些命令,例如查看files类别下有哪些命令可用:
(gdb) help files
3. list命令
(gdb) list
一次只列10行。
gdb的很多常用命令有简写形式,例如list命令可以写成l,要列一个函数的源代码也可以用函数名做参数:
(gdb) l add_range
4. 退出gdb的环境
(gdb) quit 或 q
5. start命令开始执行程序
(gdb) start
Breakpoint 1 at 0x80483ad: file main.c, line 14.
Starting program: /home/akaedu/main
main () at main.c:14
14 result[0] = add_range(1, 10);
(gdb)
6. next命令(简写为n)控制这些语句一条一条地执行。
(gdb) n
15 result[1] = add_range(1, 100);
(gdb) (直接回车)
16 printf("result[0]=%d
result[1]=%d
", result[0],
result[1]);
(gdb) (直接回车)
result[0]=55
result[1]=5105
17 return 0;
7. 用step命令(简写为s) 进入某一个模块。钻进add_range函数中去跟踪执行
(gdb) s
add_range (low=1, high=10) at main.c:6
6 for (i = low; i <= high; i++)
8. backtrace命令(简写为bt)可以查看函数调用的栈帧
(gdb) bt
#0 add_range (low=1, high=10) at main.c:6
#1 0x080483c1 in main () at main.c:14
9. info命令(简写为i)查看add_range函数局部变量的值:
(gdb) i locals
i = 0
sum = 0
10. frame命令(简写为f)选择1号栈帧然后再查看局部变量:
(gdb) f 1
#1 0x080483c1 in main () at main.c:14
14 result[0] = add_range(1, 10);
(gdb) i locals
result = {0, 0, 0, 0, 0, 0, 134513196, 225011984, -1208685768, -1081160480,
...
-1208623680}
11. 用print命令(简写为p)打印出变量sum的值:
gdb) (直接回车)
6 for (i = low; i <= high; i++)
(gdb) p sum
$1 = 3
12. finish命令让程序一直运行到从当前函数返回为止:
(gdb) finish
Run till exit from #0 add_range (low=1, high=10) at main.c:6
0x080483c1 in main () at main.c:14
14 result[0] = add_range(1, 10);
Value returned is $2 = 55
二 断点
实际运用中用的比较最多,可能就是断点了。在程序某一个地方设置一个断点,当程序运行到这人一行时,就会在此停止,此时你可以查看一些变量的情况 。
例子源码:
#include <stdio.h> int main(void) { int sum = 0, i = 0; char input[5]; while (1) { scanf("%s", input); for (i = 0; input[i] != '