GDB 概述

  GDB 是 GNU 开源组织发布的一个强大的 UNIX 下的程序调试工具。也许大多数开发人员比较喜欢那种图形界面方式的,像 VC 、 BCB 等 IDE 的调试,但如果你是在 UNIX 平台下做软件开发,你会发现 GDB 这个调试工具有比 VC 、 BCB 的图形化调试器更强大的功能。所谓 “ 寸有所长,尺有所短 ” 就是这个道理。
  一般来说, GDB 可以帮助你完成以下几个方面的功能:

  • 启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
  • 可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
  • 当程序被停住时,可以检查此时你的程序中所发生的事。
  • 动态的改变你程序的执行环境。

  从上面看来, GDB 和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现 GDB 这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。下面我们一一来看。

基础操作

  要使用 GDB 调试,需要在编译程序的时候加上 -g 参数,例如:

$ gcc -g test.c -o test

  启动 GDB 调试 test 程序:

$ gdb test

  执行 run(简写 r)运行程序,但是通常,你的命令行程序需要带上参数,那么就需要指定参数运行,例如:

(gdb) run -d /dev/mtd2

  另一种方法是使用 set args,例如:

(gdb) set args -d /dev/mtd2

  几乎每一次调试,我们都会设置断点,单步运行。GDB 设置断点的方式很灵活,使用 break(简写 b)。
  例如,在源程序第 232 行处设置断点:

(gdb) break 232

  在 function() 函数入口处设置断点:

(gdb) break function

  如果程序包含多个文件,我们还需要指定源文件,例如在 main.c 文件的第8行设置断点:

(gdb) break main.c:8

  查看断点信息:

(gdb) info break

  删除断点使用 delete(简写 d),其后的数字可以通过 info break 查看,例如删除第1个断点:

(gdb) delete 1

  执行单条语句,也就是单步运行使用 next(简写 n)命令。
  继续运行程序,使用 continue(简写 c)命令。
  使用 finish 命令退出函数。
  当程序在断点处停下来后,我们可能需要打印变量的值, 使用 print(简写 p)命令,可以打印基本类型,也可以打印复合类型,例如:

(gdb) print count

  很不幸,如果程序出错甚至崩溃,我们应该勇敢地面对它,使用 backtrace(简写 bt)命令查看函数堆栈。例如,我刚遇到了一个“Program received signal SIGSEGV, Segmentation fault.”错误:

(gdb) backtrace
#0  0x4007fc13 in _IO_getline_info () from /lib/libc.so.6
#1  0x4007fb6c in _IO_getline () from /lib/libc.so.6
#2  0x4007ef51 in fgets () from /lib/libc.so.6
#3  0x80484b2 in main (argc=1, argv=0xbffffaf4) at segfault.c:10
#4  0x40037f5c in __libc_start_main () from /lib/libc.so.6

  通常,我们只关心自己的代码,因此使用 frame 命令切换到3号堆栈帧(stack frame3),看看程序到底是在哪里崩溃的:

(gdb) frame 3
#3  0x80484b2 in main (argc=1, argv=0xbffffaf4) at segfault.c:10
10        fgets(buf, 1024, stdin)

  这样我们就可以定位到程序在 fgets() 函数处遇到了麻烦,对于这个例子,显然我们需要关注 fgets() 的参数,特别是指针类型的变量,因为这很可能是由于访问非法内存导致的。
  程序调试完,可以使用 kill(简写 k)杀死当前程序,或者使用 quit(简写 q)退出 gdb 调试。

远程调试

  前面例子是使用 gdb 调试本机程序,但是对于嵌入式开发,通常我们使用的是交叉编译环境,这样就会给调试带来一定的麻烦。
  有时候我们需要在成品机上进行调试,然而成品机把调试串口裁剪掉了。
  另外,嵌入式设备的存储容量有限,但是 gdb 调试过程需要配合源代码进行,因为 gdb 会加载对应的源代码来辅助调试,比如对于要查看一个结构体变量的内部数据时,就会去寻找该结构体在源代码中的具体定义,从而更好地解析每个数据域的内容。
  当然我们可以把源代码拷贝到嵌入式设备上,然后调试、修改、调试…… 很快我们就会发现这实在太抓狂了!
  因此,我们需要远程调试,通过 gdbserver 工具直接在嵌入式设备中调试程序。为了能够实现远程调试,需要将设备与 PC 连接到同一个网络。
  然后在设备端使用 gdbserver 启动一个远程调试会话,还是以我们的 test 程序为例,指定端口为 1234:

# gdbserver :1234 test

  在 PC 机上则直接输入 gdb 命令启动 GDB 调试工具,然后指定 ip 和端口,连接到设备端进行远程调试:

(gdb) target remote 192.168.3.100:1234

  接下来就会出现与之前的本地调试一样的提示画面了,后续的操作和本地调试也是一样的,Bingo!


【参考】

https://blog.csdn.net/zzymusic/article/details/4815142

GDB 调试工具使用指南相关推荐

  1. 用一个例子告诉你gdb调试工具如何使用

                                        用GDB调试程序 GDB概述 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式 ...

  2. 使用 Strace 和 GDB 调试工具的乐趣

    编写 UNIX® 系统程序充满乐趣,并且具有教育意义.使用 UNIX strace 工具和 GDB(GNU 项目调试工具),您可以真正地深入研究系统的功能,并了解组成这些功能的各种各样的程序.同时使用 ...

  3. linux卸载gdb命令,Linux_Unix卸载gdb调试工具出现问题的解决方法,  Unix系统通过命令能够卸载 - phpStudy...

    Unix卸载gdb调试工具出现问题的解决方法 Unix系统通过命令能够卸载安装的程序,但有用户在用make uninstall命令卸载gdb调试工具时出现了问题,卸载失败,下面小编就教大家Unix如何 ...

  4. 《深入分析GCC 》——2.2 GNU gdb调试工具

    本节书摘来自华章出版社<深入分析GCC >一书中的第2章,第2.2节,作者 王亚刚 ,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 2.2 GNU gdb调试 ...

  5. Linux下gdb调试工具的使用

    gdb是GNU开源组织发布的一个强大的Linux下的程序调试工具. gdb主要完成四个方面的功能:(1).启动你的程序,可以按照你的自定义的要求随心所欲的运行程序:(2).可让被调试的程序在你所指定的 ...

  6. C 语言编程 — GDB 调试工具

    目录 文章目录 目录 前文列表 代码调试 GDB 启动 GDB 交互命令 运行程序 暂停程序 设置断点 设置观察点 设置捕捉点 打印信息 查询运行信息 分割窗口 前文列表 <程序编译流程与 GC ...

  7. 【C语言基础】gdb调试工具的使用

    gdb调试教程 快速入门 要想快速入门gdb调试,可以直接翻阅基本案例:采内存 介绍 GDB是一个由GNU开源组织发布的.UNIX/LINUX操作系统下的.基于命令行的.功能强大的程序调试工具. 对于 ...

  8. gdb调试工具的使用

    技术交流QQ群:1027579432,欢迎你的加入! 1.gdb调试 gcc a.c b.c c.c -o app:无法进行gbd调试 gcc a.c b.c c.c -o app -g:可以进行gd ...

  9. 阿龙的学习笔记---Linux GDB 调试工具(博客转载总结)

    GDB基础操作:https://blog.csdn.net/21cnbao/article/details/7385161 100个GDB小技巧,忒多了,留着以后看.https://www.kancl ...

最新文章

  1. 五分钟带你了解哈希算法
  2. c# timer 销毁_如果表单应用程序关闭C#,如何防止发生Timer Elapsed事件
  3. hdu-4089-Activation-概率dp
  4. 机器人学习--Mobile robotics 国外大牛及实验室
  5. 单元测试01:nunit 安装与代码测试
  6. 库克遭一名自称其妻子的陌生女子威胁 苹果紧急申请限制令
  7. 汕头大学计算机英语复试,2020年汕头大学计算机应用技术考研经验分享
  8. python not_刚接触Python,python中not in怎么解释?求解释一下?
  9. Go语言strings和strconv包
  10. atitit. 浏览器插件 控件 applet 的部署,签名总结 浏览器 插件 控件 的签名安全机制o9o
  11. 4K视频质量分析 白皮书
  12. 机器学习一【决策树】
  13. 将博客搬至CSDN_莫枫恋_新浪博客
  14. 平面设计怎么学,平面设计怎么学排版:夏雨老师
  15. 初学古琴怎么学?古琴入门基础知识
  16. 科目三考试项目分类评判标准
  17. window10或XP 定时换壁纸,添加计划到windows任务里,cmd换壁纸
  18. iPhone、iPad、Android UI常用设计尺寸
  19. 小学计算机网络培训记录表,学校校本培训活动记录表(信息技术讲座)
  20. win7打印机提示无法保存设置错误0x00006cc的处理方法

热门文章

  1. GOOVIS智能眼镜进军海外市场 完美用户体验一鸣惊人
  2. 步进电机驱动器使用方法
  3. [默认值]Android修改默认wifi直连名称
  4. IGMP-Snooping相关学习
  5. 4款堪称神器的电脑黑科技软件,让人相见恨晚
  6. 前端js调用百度翻译api接口
  7. 小鼠繁育流程、要点及注意事项
  8. 关于RCU-sched的研究
  9. wordpress伪静态的原理
  10. Python电脑桌面每天更新壁纸