C实战:强大的程序调试工具GDB

1.基本调试

这里只列举最最常用的GDB命令。

1.1 启动GDB

gdb program:准备调试程序。也可以直接进入gdb,再通过file命令加载。

1.2 添加断点

b function:为函数设置断点。b是break的缩写,除了函数名,还可以是地址、当前执行处的+/-偏移等。

1.3 运行程序

run args:开始运行程序,run后面可以加程序需要的参数,就像在命令行正常运行时那样。

1.4 单步调试

s/n/si/c/kill:s即step in,进入下一行代码执行;n即step next,执行下一行代码但不进入;si即step instruction,执行下一条汇编/CPU指令;c即continue,继续执行直到下一个断点处;kill终止调试;quit退出GDB。

1.5 打印调试信息

bt:bt是backtrace的缩写,打印当前所在函数的堆栈路径。
info frame id:打印选中的栈帧的信息。
info args:打印选中栈帧的参数。
print variable:打印指定变量的值。
list:列出相应的源代码。
info registers:查看所有寄存器的值。

还有个更灵活强大的是直接打印%esp开始的前N个元素,例如打印栈上前10个元素就是:x/10x $sp

2.GDB实战

下面是一个使用了上述命令的实战例子:

[root@BC-VM-edce4ac67d304079868c0bb265337bd4 bufbomb]# gdb bufbomb
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-75.el6)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/Temp/bufbomb/bufbomb...done.
(gdb) b getbuf
Breakpoint 1 at 0x8048ad6
(gdb) run -t cdai
Starting program: /root/Temp/bufbomb/bufbomb -t cdai
Team: cdai
Cookie: 0x5e5ee04eBreakpoint 1, 0x08048ad6 in getbuf ()
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.149.el6_6.4.i686(gdb) bt
#0  0x08048ad6 in getbuf ()
#1  0x08048db2 in test ()
#2  0x08049085 in launch ()
#3  0x08049257 in main ()
(gdb) info frame 0
Stack frame at 0xffffb540:eip = 0x8048ad6 in getbuf; saved eip 0x8048db2called by frame at 0xffffb560Arglist at 0xffffb538, args: Locals at 0xffffb538, Previous frame's sp is 0xffffb540Saved registers:ebp at 0xffffb538, eip at 0xffffb53c
(gdb) info registers
eax            0xc      12
ecx            0xffffb548       -19128
edx            0xc8c340 13157184
ebx            0x0      0
esp            0xffffb510       0xffffb510
ebp            0xffffb538       0xffffb538
esi            0x804b018        134524952
edi            0xffffffff       -1
eip            0x8048ad6        0x8048ad6 <getbuf+6>
eflags         0x282    [ SF IF ]
cs             0x23     35
ss             0x2b     43
ds             0x2b     43
es             0x2b     43
fs             0x0      0
gs             0x63     99
(gdb) x/10x $sp
0xffffb510:     0xf7ffc6b0      0x00000001      0x00000001      0xffffb564
0xffffb520:     0x08048448      0x0804a12c      0xffffb548      0x00c8aff4
0xffffb530:     0x0804b018      0xffffffff(gdb) si
0x08048ad9 in getbuf ()
(gdb) si
0x08048adc in getbuf ()
(gdb) si
0x080489c0 in Gets ()
(gdb) n
Single stepping until exit from function Gets,
which has no line number information.
Type string:123
0x08048ae1 in getbuf ()
(gdb) si
0x08048ae2 in getbuf ()
(gdb) c
Continuing.
Dud: getbuf returned 0x1
Better luck next timeProgram exited normally.
(gdb) quit

3.逆向调试

GDB 7.0后加入了Reversal Debugging功能。具体来说,比如我在getbuf()和main()上设置了断点,当启动程序时会停在main()函数的断点上。此时敲入record后continue到下一断点getbuf(),GDB就会记录从main()到getbuf()的运行时信息。现在用rn就可以逆向地从getbuf()调试到main()。就像《X战警:逆转未来》里一样,挺神奇吧!

这种方式适合从bug处反向去找引起bug的代码,实用性因情况而异。当然,它也是有局限性的。像程序假如有I/O输出等外部条件改变时,GDB是没法“逆转”的。

[root@vm bufbomb]# gdb bufbomb
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-75.el6)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/Temp/bufbomb/bufbomb...done.(gdb) b getbuf
Breakpoint 1 at 0x8048ad6
(gdb) b main
Breakpoint 2 at 0x80490c6(gdb) run -t cdai
The program being debugged has been started already.
Start it from the beginning? (y or n) yStarting program: /root/Temp/bufbomb/bufbomb -t cdaiBreakpoint 2, 0x080490c6 in main ()
(gdb) record
(gdb) c
Continuing.
Team: cdai
Cookie: 0x5e5ee04eBreakpoint 1, 0x08048ad6 in getbuf ()(gdb) rn
Single stepping until exit from function getbuf,
which has no line number information.
0x08048dad in test ()
(gdb) rn
Single stepping until exit from function test,
which has no line number information.
0x08049080 in launch ()
(gdb) rn
Single stepping until exit from function launch,
which has no line number information.
0x08049252 in main ()

C实战:强大的程序调试工具GDB相关推荐

  1. Linux下的程序调试——GDB

    无论是多么优秀的程序员,都难以保证自己在编写代码时不会出现任何错误,因此调试是软件开发过程中的一个必不可少的 组成部分.当程序完成编译之后,它很可能无法正常运行,或者会彻底崩溃,或者不能实现预期的功能 ...

  2. 万变不离其宗——程序动态分析(gdb)

     万剑归宗是无名的招数,但是它却道出一个道理.不管剑招多么花哨,多么厉害,最终还是需要回归正宗与朴实.程序也是一样,不管代码如何实现,不论语言如何,技巧如何,最终也是要能够被正确,有效,可靠的运行 ...

  3. 一线程序员带你实践学习企业实战C/C++程序员课程

    作者吴从周 资源简介: 传统的C/C++的教材和课程都属于学院派,只是单纯的讲一些知识点,却没有讲到实际开发中我们常用的知识点有哪些,本课程将打破传统的弊端,一线程序员将带你实践学习企业实战项目中LI ...

  4. 性能工具之调试工具 GDB(你以为性能分析中用不到吗?)

    文章目录 一.前言 二.环境依赖 三.Helloword 示例 四.调试 Redis 示例 1.下载 Redis 源码并解压 2.确认编译选项 3.检查编译 4.GDB 调用 redis-server ...

  5. php strace 工具,Linux程序调试工具工具—strace命令

    1.简介 strace是Linux环境下的一款程序调试工具,用来检察一个应用程序所使用的系统调用.Strace是一个简单的跟踪系统调用执行的工具.在其最简单的形式中,它可以从开始到结束跟踪二进制的执行 ...

  6. 如何成为强大的程序员?(转)

    Aaron Stannard 是新创公司 MarkedUp 的CEO,他最近花费大量时间雇佣.评估很多不同的程序员,并和他们一起协作.在这个过程中他发现并总结了十种程序员无法意识到自己潜力的原因,意在 ...

  7. .net中button按钮点击之后的两个参数是什么意思_如果想完成更加有意思和强大的程序,你应该这么做...

    好嘴头子,不如烂笔头子,讲了这么些理论,不动手试试是不行的! 请点击右上角"关注"按钮关注我们哟:跟着木辛老师学习Python编程知识,变身快乐的编程达人吧~ 大家好,木辛老师又来 ...

  8. 北京尚学堂教你:如何成为强大的程序员?

    2019独角兽企业重金招聘Python工程师标准>>> 大公司中所使用的技术非常复杂,某些大型企业都很难掌握,所以对于想要加入团队的程序员来说,入门门槛非常高.因此,尽管他们非常仔细 ...

  9. 威纶通,威纶通模板,HMI,HMI UI,GUI,7寸触摸屏 通用,非常漂亮功能强大的程序模板,非常有参考价值,可直接移植项目使用

    威纶通,威纶通模板,HMI,HMI UI,GUI,7寸触摸屏 通用,非常漂亮功能强大的程序模板,非常有参考价值,可直接移植项目使用

最新文章

  1. make: warning: file “xxx“ has modification time yyy s in the future 解决方法
  2. Kafka(1)-概述
  3. android如何设置软件的版本,假的设置软件-假的设置(型号模拟)下载v2.5 安卓版-西西软件下载...
  4. Java jdbctemplate赋值_JDBCTemplate基本使用
  5. java解析带斜杠的参数_Java Spring MVC应用程序仅接受带有斜杠的POST请求
  6. 从键盘上录入两个整数,计算a的b次方的结果
  7. css文本溢出 so easy~
  8. 人生是什么?——感悟1:勇于承担自己的选择才是真正的勇气
  9. new Option() 创建一个option标签
  10. spark集成hbase与hive数据转换与代码练习
  11. 音频文件--PCM、 WAV、 MP3及AMR格式分析
  12. 用Python实现开心消消乐小游戏
  13. 仿Windows画板喷漆笔刷效果
  14. ETL KETTLE 读取csv文件写入数据库
  15. 专科毕业,从0到1400star,从阮一峰周刊到尤雨溪推荐的开源项目总结
  16. 对一个8位(一字节)数的倒序处理
  17. 个人中心html更换头像,html 上传头像前预览以及点击头像去选择和更换头像
  18. 手把手教你批量剪辑视频
  19. 嵌入式工程师“中年危机”应对策略上
  20. 跬智信息(Kyligence)荣获浦东新区人工智能创新应用大赛一等奖

热门文章

  1. 【计算机图形学】小白谈计算机图形学(二)画圆篇之中点画圆法,Bresenham画圆算法,椭圆实操,线型处理详解
  2. k8s pvc Terminating 状态无法删除
  3. [每天get点新技能]搜商——从A到Z亚马逊A9引擎
  4. java对脚本语言的支持
  5. 中兴oltc320用户手册_中兴C320C300 V2版本OLT开局配置手册.doc
  6. Caché 从入门到精通
  7. 遏制阿里,还是卖音箱?谷歌5.5亿美元投资京东被指借道回归中国
  8. 右键计算机管理显示目录名称无效,电脑资源管理器的右键上下文菜单打不开的两种解决办法...
  9. 一分钟快速重启资源管理器
  10. 大话西游2服务器显示不出来,大话西游2:不到一年的服务器出现2只化无龙兔,主人是同一个人...