Chinaunix首页 | 论坛 | 博客
  • 博客访问: 60862
  • 博文数量: 8
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 82
  • 用 户 组: 普通用户
  • 注册时间: 2014-11-04 17:00
文章分类

全部博文(8)

文章存档

2016年(5)

2015年(3)

我的朋友

分类: C/C++

2016-03-05 15:35:24


转载请注明出处http://blog.chinaunix.net/uid-30008524-id-5663301.html
     
        C/C++跟其它语言的一个很大不同的地方是它经常要显式地操作内存,这也是它复杂的地方,一旦操作不当,后果相当严重。所以学习C/C++不免要往底层去探索(其实看一种语言是比较底层的语言还是比较高级的语言,主要是看它对你的设备权限有多大,权限越大越靠近底层,像汇编语言就比C要底层,因为它经常操作寄存器,面子够大的)。一个优秀的C/C++程序员不仅要熟练使用这门语言,还要知道它在背后干了什么。
gdb正好满足了这种探索的欲望。这个系列的文章正是通过gdb探索一个C/C++程序在运行的背后,做了什么。
  建议学C/C++最好在Unix/Linux下,因为Window有个特点,就是它会自作聪明地显示那些它认为你需要的信息,隐藏那些它认为你不需要的信息,这个从装机过程可以看到,Linux在装机过程中会打印出它在干什么,而Window则只会显示“你好”,“稍等片刻”,“这需要几分钟的时间”等等。如果它隐藏的信息刚好是你想要的,那摔电脑也没用。所以一些Window新手程序员遇到一个“未知错误”的时候,往往会选择绕过它,而不是解决它。

使用gdb之前,先要把调试信息加入到程序中,用gcc/g++编译的时候加上-g选项
以下是gdb常常会用到的命令:
进入gdb环境:gdb 程序名
例:gdb test
开始运行程序:run
遇到断点会停止运行
继续运行:c
单步运行(不进入函数):next
单步运行(进入函数):step
设置断点:break 行号/函数名
例:break 5
在第五行设置断点,此时程序会执行完第4行后停止运行
查看栈:bt
查看局部变量的值:info local
查看变量的值:print 变量名
例:print var
查看变量的内存地址:print &变量名
例:print &var
查看变量占用的内存大小(字节):print sizeof(变量名)
例:print sizeof(var)
查看变量的类型:ptype 变量名
例:ptype var
查看某段内存地址放的内容:x/nfu 地址
n是步数
f是打印方式,u(十进制),x(十六进制),s(字符串)
u是步长,可以用以下几个字符表示:b(单字节),h(双字节),w(四字节),g(八字节)
例:x/3uh 0x54320 
从地址0x54320开始,取三个步长,每个步长2个字节,就是6个字节,以十进制打印这段内存里面的内容
例:x/4xb &var
打印var的地址开始的4个字节内容
退出gdb:q

阅读(2548) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~