这篇文章主要介绍了 Linux 调试工具 GDB 使用简易教程, 小编觉得还是挺不错的, 具有一定借鉴价值, 需要的朋友可以参考下
本文所述主要是 Linux 调试工具 GDB 的使用教程, 具体如下
声明: 本博客内容是由本人经过实验楼教程整理得来
GDB 的相关概念
GDB, 是 The GNU Project Debugger 的缩写, 是 Linux 下功能全面的调试工具 GDB 支持断点单步执行打印变量观察变量查看寄存器查看堆栈等调试手段在 Linux 环境软件开发中, GDB 是主要的调试工具, 用来调试 C 和 C++ 程序
GDB 的相关操作
下面给出一个具有 buging.c 的程序:
- [yqtao@localhost linux]$ cat buging.c
- #include <stdio.h>
- int getSum(int n) {
- int sum=0,i;
- for (i=1;i<=n;i++)
- sum+=i;
- return sum;
- }
- int main(){
- int res=getSum(100);
- printf("1+2+...+100=%d\n",res);
- }
如果要调试程序, 则在进行 gcc 编译的时候要加上 - g 参数
gcc -g -o bugging bugging.c
进入 gdb:
gdb buging
部分 gdb 命令:
- // 查看源码
- // 查看第几行附近
- // 可简写成 l 2
- (gdb) list 2 1#include < stdio.h > 2 int getSum(int n) {
- 3 int sum = 0,
- i;
- 4
- for (i = 1; i <= n; i++) 5 sum += i;
- 6
- return sum;
- 7
- }
- // 查看 main 函数附近的源码
- (gdb) list main 3 int sum = 0,
- i;
- 4
- for (i = 1; i <= n; i++) 5 sum += i;
- 6
- return sum;
- 7
- }
- 8 int main() {
- 9 int res = getSum(100);
- 10 printf("1+2+...+100=%d\n", res);
- 11
- }
- // 设置断点
- // break +n 在第几行设断点
- (gdb) break 8 Breakpoint 1 at 0x4004fa: file buging.c,
- line 8.
- // break + 函数名 , 在函数名处设断点
- (gdb) break getSum Breakpoint 2 at 0x4004cb: file buging.c,
- line 3.
- // 查看断点信息
- (gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep y 0x00000000004004fa in main at buging.c: 8 2 breakpoint keep y 0x00000000004004cb in getSum at buging.c: 3
断点信息中每一项的信息:
1.Num 列代表断点编号, 该编号可以作为 delete/enalbe/disable 等控制断点命令的参数
2.Type 列代表断点类型, 一般为 breakpoint
3.Disp 列代表断点被命中后, 该断点保留 (keep) 删除 (del) 还是关闭(dis)
4.Enb 列代表该断点是 enable(y) 还是 disable(n)
5.Address 列代表该断点处虚拟内存的地址
6.What 列代表该断点在源文件中的信息
- // 删除断点
- // delete +n 或 d +n
- // 如果不加数字则删除全部的断点
- (gdb) d 2
- (gdb) info breakpoints
- Num Type Disp Enb Address What
- 1 breakpoint keep y 0x00000000004004fa in main at buging.c:8
关闭和启用断点:
有时候, 我们会遇到这种情况: 有些断点可能暂时不用但又不想删除, 那么可以 disable.
- disable +n // 关闭断点
- enable +n // 启动断点
GDB 单步调试
以本文开头的 buging.c 文件为例, 进行单步调试
- // 进入 gdb
- [yqtao@localhost linux]$ gdb buging
- // 在 main()函数处设断点
- (gdb) info breakpoints
- // 运行程序
- (gdb) run
- Breakpoint 1, main () at buging.c:9
- 9 int res=getSum(100);
注意: 我们要进入函数要是用 step(s), 而单步执行 next(n),next 是不进入函数内部的, 要区分两者的关系
- (gdb) step
- getSum (n=100) at buging.c:4
- 4 for (i=1;i<=n;i++)
- // 查看代码
- (gdb) l
- 1 #include <stdio.h>
- 2 int getSum(int n) {
- 3 int sum=0,i;
- 4 for (i=1;i<=n;i++)
- 5 sum+=i;
- 6 return sum;
- 7 }
- 8 int main(){
- 9 int res=getSum(100);
- 10 printf("1+2+...+100=%d\n",res);
- // 下一步
- (gdb) s
- 5 sum+=i;
- // 打印 sum 的值
- // 看到 sum 是为赋初值的
- (gdb) p sum
- $1 = 4195633
- // info locals
- // 打印当前断点处所在函数的所有局部变量的值, 不包括函数参数
- (gdb) info locals
- sum = 4195635
- i = 3
其余的一些命令:
finish
执行程序到当前函数结束
continue
执行程序到下个断点
until
until N, 执行程序到源代码的某一行
来源: http://www.phperz.com/article/18/0225/363141.html