`
dowhathowtodo
  • 浏览: 777583 次
文章分类
社区版块
存档分类
最新评论

GDB调试程序之查看运行时数据

 
阅读更多

本文章转载自:http://www.cnblogs.com/yangce/archive/2011/11/20/2256482.html另外,本博客技术含量非常高,值得品味。


在用gdb调试程序时,当程序运行到之前设置的断点时,很容易想到的操作就是查看当前变量的值,而gdb可以很轻易地满足的你的需求的~~

在gdb中最常用的命令就是print(简写p),具体格式如下:

print <expr>
print/f <expr>  f代表输出的格式
 x 按十六进制格式显示变量
 d 按十进制格式显示变量
 u 按十六进制格式显示无符号整型
 o 按八进制格式显示变量
 t 按二进制格式显示变量
 a 按十六进制格式显示变量
 c 按字符格式显示变量
 f 按浮点数格式显示变量

表达式

print命令可以接受表达式,其中表达式的定义遵循C/C++语法,需要注意的是表达式中不能出现程序中定义的宏表达式;同时在gdb表达式中,还支持以下三种特殊的操作符:

@       是一个和数组有关的操作符,在后面会有更详细的说明
::      指定一个在文件或是一个函数中的变量,注意与C++语法中的::操作符的区分
{}      表示一个指向内存地址的类型为type的一个对象

程序变量的定位

在GDB中,查看以下三种变量的值:
1、全局变量(所有文件可见的)
2、静态全局变量(当前文件可见的)
3、局部变量(当前Scope可见的)

如果出现局部变量和全局变量相互冲突时,局部变量会覆盖全局变量,可以使用::限制符来查看全局变量

file::variable
function::variable

注意事项:如果在编译时加入了编译优化选项,即-O3选项,编译器会修改你的程序,同时可能查看不同某些变量,这时在调试时建议把优化选项关掉,即-O0

动态数组

你需要查看一段连续的内存空间的值。比如数组的一段,或是动态分配的数据的大小。你可以使用GDB的“@”操作符,“@”的左边是第一个内存的地址的值,“@”的右边则你你想查看内存的长度。例如,你的程序中有这样的语句:

int *array = (int *) malloc (len * sizeof (int));

于是,在GDB调试过程中,你可以以如下命令显示出这个动态数组的取值:

p *array@len

@的左边是数组的首地址的值,也就是变量array所指向的内容,右边则是数据的长度,其保存在变量len中,其输出结果,大约是下面这个样子的:

(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}

查看内存

gdb中可以使用examine命令来查看内存内容,简写为x,使用方法如下:

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表示按十六进制显示

自动显示

在gdb中,你可以设置当程序停在断点处时,自动显示变量的内容,即display命令,使用如下:

 display <expr>
 display/<fmt> <expr>
 display/<fmt> <addr>
 expr是一个表达式,fmt表示显示的格式,addr表示内存地址

一个非常有用的命令,显示源码与机器码的对应:

display/i $pc
$pc是GDB的环境变量,表示着指令的地址,/i则表示输出格式为机器指令码,也就是汇编。于是当程序停下后,就会出现源代码和机器指令码相对应的情形

与display管理相关的命令:

undisplay
delete display
disable display
enable display
info display  查看display设置的自动显示的信息

查看寄存器

info registers            查看寄存器的情况。(除了浮点寄存器)
info all-registers        查看所有寄存器的情况。(包括浮点寄存器)
info registers       查看所指定的寄存器的情况
分享到:
评论

相关推荐

    GDB调试完整文档

    比较全面的GDB调试使用文档。 GDB概述 使用GDB GDB的命令概貌 GDB中运行UNIX的shell程序 在GDB中运行程序 调试已运行的程序 暂停 / 恢复程序运行 一、设置断点(BreakPoint) 二、设置观察点(WatchPoint)...

    GDB调试程序-入门级

    详细并且全面的GDB入门,易理解。 内容: 一、 GDB概述 二、系统认识GDB 三、GDB的命令概貌 四、GDB中运行UNIX的shell程序 五、在GDB中运行程序 ...九、查看运行时数据 十、查看寄存器 十一、改变程序的执行

    GDB应用程序调试

    1. gdb运行在调试机上,gdbserver运行在 目标机上。 2. 两者之间的通信数据格式由gdb远程串行 协议RSP(Remote Serial Protocol)定义。 3. RSP协议数据的基本格式为:“$数据#校 验”,协议数据可以基于串口,TCP,...

    linux使用gdb调试方法详解

    linux使用gdb调试方法详解,包含 GDB 命令、在 GDB 里运行程序的例子,如何打断点和继续运行、查看堆栈信息、检查源文件,查看内存信息和各种数据

    GDB手册(中文整理)

    用GDB调试程序 一:GDB概述 二:一个调试示例 三:使用GDB 四:GDB的命令概貌 五:GDB中运行UNIX的shell程序 六:在GDB中运行程序 七:调试已运行的程序 八:暂停 / 恢复程序运行 九:查看栈信息 十:查看源程序 ...

    GDB使用手册.CHM

    用于在Linux下调试C语言,C++等程序.其中包括: GDB常用命令详解 GDB的使用方法 GDB中运行UNIX的shell程序 查看运行时数据 处理源程序 调试已运行的程序 ...用GDB调试程序示例 解说详细,来源于网络,经过本人细心整理.

    GDB(GNU Debugger)调试器工具

    GDB提供了一组命令和功能,允许开发人员在程序运行时检查和分析程序状态,帮助找出代码中的错误和问题。 GDB的主要作用如下: 断点调试:GDB允许开发人员在代码中设置断点,使程序在指定的位置停止执行。这样,开发...

    TRACE-ICP使用手册

    1.2.3 Eclipse with GDB调试界面的安装 2. 工作机制 2.1 介绍Embedded-ICE 2.2 调试协议转换 3. PowerView调试界面的使用 3.1 打开调试界面 3.2 JTAG连接设置 3.3 运行脚本文件 3.4 观察/修改寄存器 3.5 ...

    ddd--linux下著名的调试工具

    GNU DDD(Data Display Debugger)是命令行调试程序,如GDB、DBX、WDB、Ladebug、JDB、XDB、Perl Debugger或Python Debugger的可视化图形前端。它特有的图形数据显示功能(Graphical Data Display)可以把数据结构按照...

    linux0.11-simulation-:模拟一个简单程序运行时linux0.11对进程和内存的处理方式

    模拟一个简单程序运行时linux0.11对进程和内存的处理方式 仿真内容 以linux0.11中进程,内存,系统调用相关的代码为核心,描述了某个简单程序在linux0.11运行时的操作序列。 ,计划,释放,内存的缺页和写保护异常...

    google-perftools 源码 (一款针对 C/C++ 程序的性能分析工具)

    gdb 是 Linux 上广泛使用的调试工具,它提供了强大的命令行功能,使我们可以在程序运行时插入断点并在断点处执行其他函数。具体的文档请参照 http://www.gnu.org/software/gdb/,本文中将只对用到的几个基本功能进行...

    xmine c++资源

    早期的调试程序没有很好的方法将任意的指针换成一个数组。就像对待参数一样,让我们查看内存中在变量h后面的10个整数,一个动态数组的语法如下所示: base@length 因此,要想显示在h后面的10个元素,可以使用h@10: ...

    Shell命令解释器项目源码+文档

    Linux操作系统中shell是用户与系统内核沟通的中介,它为用户使用操作系统的服务提供了一个命令行界面,用户在shell提示符下输入的每个命令都由shell先解释,然后传给内核执行。...6、 使用调试器gdb来调试程序;

    eclipse 开发c/c++

    通常情况下,象 ddd 和 xxgdb(请参阅 参考资料以获得链接)之类的第三方 GUI 调试器在实现调试功能时都依赖于 GDB 的命令行接口(Command Line Interface,CLI)。 遗憾的是,经过证实该接口非常不可靠。GDB/MI ...

    SOPC系统入门教程

    4.7.5 用Nios OCI 调制控制台下载、运行和调试程序 4.7.6 重建(rebuild)软件 4.7.7 下载软件到 Flash 4.7.8 第三方开发和调试工具 4.8 使用.hexout 4.9 其它的开发板通信和调试方法 4.9.1 ...

    Voltron:面向黑客的hacky调试器UI

    它旨在通过启用实用程序视图的附件来改善各种调试器(LLDB,GDB,VDB和WinDbg)的用户体验,这些视图可以从调试器主机检索和显示数据。 通过在其他TTY中运行这些视图,您可以构建自定义的调试器用户界面来满足您的...

    SOPC 系统设计入门教程

    4.7.5 用 Nios OCI 调制控制台下载、运行和调试程序 4.7.6 重建(rebuild)软件 4.7.7 下载软件到 Flash 4.7.8 第三方开发和调试工具 4.8 使用.hexout 4.9 其它的开发板通信和调试方法 4.9.1 ...

    ARM应用系统开发详解

    7.2.3 使用GDB调试程序 7.3 建立uClinux开发环境 7.3.1 建立交叉编译器 7.3.2 uClinux针对硬件的改动 7.3.3 编译uClinux内核 7.3.4 内核的加载运行 7.4 在uClinux下开发应用程序 7.4.1 串行通信 7.4.2 socket编程 ...

    linux网络编程-宋敬彬-part1

    2.4.2 使用GDB调试程序 49 2.4.3 GDB常用命令 52 2.4.4 其他的GDB 59 2.5 小结 60 第3章 文件系统简介 61 3.1 Linux下的文件系统 61 3.1.1 Linux下文件的内涵 61 3.1.2 文件系统的创建 62 3.1.3 挂...

Global site tag (gtag.js) - Google Analytics