GDB简明教程
来源:互联网 发布:淘宝安装师傅怎么加盟 编辑:程序博客网 时间:2024/04/30 17:06
声明:本博客内容是由本人经过实验楼教程整理得来。
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 main3 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 8Breakpoint 1 at 0x4004fa: file buging.c, line 8.// break +函数名 ,在函数名处设断点(gdb) break getSumBreakpoint 2 at 0x4004cb: file buging.c, line 3.//查看断点信息(gdb) info breakpoints Num Type Disp Enb Address What1 breakpoint keep y 0x00000000004004fa in main at buging.c:82 breakpoint keep y 0x00000000004004cb in getSum at buging.c:3
断点信息中每一项的信息:
- Num 列代表断点编号,该编号可以作为 delete/enalbe/disable 等控制断点命令的参数
- Type 列代表断点类型,一般为 breakpoint
- Disp 列代表断点被命中后,该断点保留(keep)、删除(del)还是关闭(dis)
- Enb 列代表该断点是 enable(y) 还是 disable(n)
- Address 列代表该断点处虚拟内存的地址
- What 列代表该断点在源文件中的信息
// 删除断点// delete +n 或 d +n// 如果不加数字则删除全部的断点(gdb) d 2(gdb) info breakpoints Num Type Disp Enb Address What1 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) runBreakpoint 1, main () at buging.c:99 int res=getSum(100);
注意:我们要进入函数要是用step(s),而单步执行next(n),next是不进入函数内部的,要区分两者的关系。
(gdb) stepgetSum (n=100) at buging.c:44 for (i=1;i<=n;i++)// 查看代码(gdb) l1 #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) s5 sum+=i;// 打印sum的值// 看到sum是为赋初值的(gdb) p sum$1 = 4195633// info locals//打印当前断点处所在函数的所有局部变量的值,不包括函数参数。(gdb) info localssum = 4195635i = 3
其余的一些命令:
finish
执行程序到当前函数结束
continue
执行程序到下个断点
until
until N,执行程序到源代码的某一行
7 1
- GDB简明教程【转】
- GDB简明教程
- gdb 简明教程
- GDB使用简明教程
- GDB简明教程
- gdb简明手册
- SQL教程简明教程
- GDB简明指南(转)
- GDB教程
- GDB教程
- gdb教程
- GDB教程
- gdb教程
- GDB教程
- GDB教程
- GDB教程
- GDB教程
- 简明批处理教程
- shell下用 %% ## 自定义规则提取字符
- poj 1487 Single-Player Games(高斯消元+字符串处理)
- leetcode 233 - Number of Digit One
- 正则笔记
- Python入门——认识函数
- GDB简明教程
- 【leetcode】423. Reconstruct Original Digits from English
- 架构、框架、模式和平台的区别
- struts2入门
- JNDI服务提供者连接工厂之RegistryContextFactory(RMI)
- Unity 入门 Ray类
- hdu1098Ignatius's puzzle
- Maya2012中英文对照表(二)
- CodeForces 733B - Parade