用GDB调试程序(五)
———————
在你调试程序时,当程序被停住时,你可以使用print命令(简写命令为p),或是同义命令inspect来查看当前程序的运行数据。print命令的格式是:
print <expr>
print /<f> <expr>
<expr>是表达式,是你所调试的程序的语言的表达式(GDB可以调试多种编程语言),<f>是输出的格式,比如,如果要把表达式按16进制的格式输出,那么就是/x。
一、表达式
表达式的语法应该是当前所调试的语言的语法,由于C/C++是一种大众型的语言,所以,本文中的例子都是关于C/C++的。(而关于用GDB调试其它语言的章节,我将在后面介绍)
在表达式中,有几种GDB所支持的操作符,它们可以用在任何一种语言中。
@
是一个和数组有关的操作符,在后面会有更详细的说明。
::
指定一个在文件或是一个函数中的变量。
{<type>} <addr>
表示一个指向内存地址<addr>的类型为type的一个对象。
二、程序变量
1、全局变量(所有文件可见的)
2、静态全局变量(当前文件可见的)
3、局部变量(当前Scope可见的)
如果你的局部变量和全局变量发生冲突(也就是重名),一般情况下是局部变量会隐藏全局变量,也就是说,如果一个全局变量和一个函数中的局部变量同名时,如果当前停止点在函数中,用print显示出的变量的值会是函数中的局部变量的值。如果此时你想查看全局变量的值时,你可以使用“::”操作符:
file::variable
function::variable
可以通过这种形式指定你所想查看的变量,是哪个文件中的或是哪个函数中的。例如,查看文件f2.c中的全局变量x的值:
gdb) p 'f2.c'::x
当然,“::”操作符会和C++中的发生冲突,GDB能自动识别“::” 是否C++的操作符,所以你不必担心在调试C++程序时会出现异常。
另外,需要注意的是,如果你的程序编译时开启了优化选项,那么在用GDB调试被优化过的程序时,可能会发生某些变量不能访问,或是取值错误码的情况。这个是很正常的,因为优化程序会删改你的程序,整理你程序的语句顺序,剔除一些无意义的变量等,所以在GDB调试这种程序时,运行时的指令和你所编写指令就有不一样,也就会出现你所想象不到的结果。对付这种情况时,需要在编译程序时关闭编译优化。一般来说,几乎所有的编译器都支持编译优化的开关,例如,GNU的C/C++编译器GCC,你可以使用“-gstabs”选项来解决这个问题。关于编译器的参数,还请查看编译器的使用说明文档。
int *array = (int *) malloc (len * sizeof (int));
于是,在GDB调试过程中,你可以以如下命令显示出这个动态数组的取值:
(gdb) p *array@len
$1 = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40}
四、输出格式
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。
$21 = 101
(gdb) p/a i
$22 = 0x65
(gdb) p/c i
$23 = 101 'e'
(gdb) p/f i
$24 = 1.41531145e-43
(gdb) p/x i
$25 = 0x65
(gdb) p/t i
$26 = 1100101
五、查看内存
x/<n/f/u> <addr>
n、f、u是可选的参数。
n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。
u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。
<addr>表示一个内存地址。
命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。
六、自动显示
display <expr>
display/<fmt> <expr>
display/<fmt> <addr>
expr是一个表达式,fmt表示显示的格式,addr表示内存地址,当你用display设定好了一个或多个表达式后,只要你的程序被停下来,GDB会自动显示你所设置的这些表达式的值。
格式i和s同样被display支持,一个非常有用的命令是:
display/i $pc
$pc是GDB的环境变量,表示着指令的地址,/i则表示输出格式为机器指令码,也就是汇编。于是当程序停下后,就会出现源代码和机器指令码相对应的情形,这是一个很有意思的功能。
下面是一些和display相关的GDB命令:
undisplay <dnums...>
delete display <dnums...>
删除自动显示,dnums意为所设置好了的自动显式的编号。如果要同时删除几个,编号可以用空格分隔,如果要删除一个范围内的编号,可以用减号表示(如:2-5)
disable display <dnums...>
enable display <dnums...>
disable和enalbe不删除自动显示的设置,而只是让其失效和恢复。
info display
查看display设置的自动显示的信息。GDB会打出一张表格,向你报告当然调试中设置了多少个自动显示设置,其中包括,设置的编号,表达式,是否enable。
用GDB调试程序(五)相关推荐
- 用GDB调试程序(转)
用GDB调试程序 GDB概述 ---- GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台下做 ...
- 使用gdb调试程序详解
熟练使用gdb是一个linux下开发人员必备的一项技能,我们由浅入深的学习一下gdb的强大功能. 一.gdb简单介绍 名称 gdb - GNU 调试器 提要 gdb [-help] [ ...
- 转:用GDB调试程序
从CSDN的网站上找到的GDB使用说明. 原文标题:用GDB调试程序 作者:haoel (QQ是:753640,MSN是: haoel@hotmail.com) 关键字:gdb 调试 ...
- GDB调试程序系列 (3)
GDB调试程序系列 (3) 用GDB调试程序 来源:www.trucy.org (2005-03-23 16:48:14) GDB是一个强大的命令行调试工具.大家知道命令行的强大就是在于,其可以形成 ...
- GDB 调试程序 详解 使用实例
用GDB调试程序 GDB概述 ---- GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台下做 ...
- 【linux】Valgrind工具集详解(六):使用Valgrind gdbserver和GDB调试程序
一.概述 在Valgrind下运行的程序不是由CPU直接执行的.相反,它运行在Valgrind提供的合成CPU上.这就是调试器在Valgrind上运行时无法调试程序的原因. 二.快速入门 在使用Mem ...
- 你还在用GDB调试程序吗?
↑ 点击蓝字 关注视学算法 作者丨薛定谔的喵@知乎 来源丨https://zhuanlan.zhihu.com/p/152274203 编辑丨极市平台 你还在用GDB调试程序吗? 如果是,那么我们是同 ...
- 用GDB调试程序(一)
用GDB调试程序 GDB概述 ---- GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台下做 ...
- GDB调试程序-Ubuntu
导读: 用GDB调试程序 出自Ubuntu中文 目录 [隐藏] 1 GDB概述 2 一个调试示例 3 使用GDB 4 GDB的命令概貌 5 GDB中运行UNIX的shell程序 6 在GDB中运行程序 ...
- gdb调试程序函数名为问号,什么原因?step by step解决方案
gdb调试程序函数名为问号,什么原因?step by step解决方案 参考文章: (1)gdb调试程序函数名为问号,什么原因?step by step解决方案 (2)https://www.cnbl ...
最新文章
- Failed to resolve:com.gtihub (android引入库的时候提示这样的错误)
- js进阶 10-8 伪类选择器有哪几类(自己不用,永远不是自己的)
- CTF---安全杂项入门第三题 这是捕获的黑客攻击数据包,Administrator用户的密码在此次攻击中泄露了,你能找到吗?...
- 如何断开mongodb数据库连接_如何连接远程mongodb数据库
- python split函数 空格_python上手--10行代码读懂红楼梦
- python入门——P44魔法方法:简单定制
- Q99:当Bezier曲面(Utah Teapot)同时遇上“噪声纹理”和“Phong反射模型”
- python 成语库_Python“Every Other Element”成语
- AIDE2.6.1安装及配置C/C++开发数据
- 编译protoc方法名称被自动大写
- win7计算机怎么重置,win7系统快速重置的设置办法
- levene ttest
- 一篇文章了解光学器件的各种参数含义
- 安卓教室会议室预约系统源码
- MATLAB水箱液位模糊控制仿真程序
- RFID定位之隧道人员定位系统解决方案--新导智能
- AUTOSAR Classic Platform支持SOME/IP吗?
- XMind软件非试用版本下载(亲测有效)
- 2019 最新版百度云下载破解限速工具,一个办法让你告别下载慢的体验!
- 中标捷报 | 南大通用GBase 8a中标泉州银行
热门文章
- 对话高博(二)| 换工作这件事
- 仿QQ空间用一个tableview显示多种自定义cell
- 企业研发管理工具应用分析
- 2010年7月blog汇总:OpenTest、MetaModelEngine和敏捷个人
- python mp4提取音频加入另一段视频_使用 PHP-FFMpeg 操作视频/音频文件
- golang适合做什么_这年头中年女人适合做什么兼职
- 70个Python练手项目列表,看了让你茅塞顿开~
- static string java_java:String类、static关键字、Arrays类、 Math类
- c 自定义实现string类 clear_基于scala2.13实现自定义的集合类 (下)
- 为什么php动态语言,动态语言静态化