Linux程序调试GDB——数据查看

摘要:
查看运行时数据gdb中变量的命令是print,通常缩写为p.FinishRuntillexitfrom#0foo()atm。c: 9主(大气压)。c: 1515}Valuereturnedis$2=1002。返回值将存储在eax寄存器中。您可以通过查看信息获得返回值。P$eax$3=100inforegisterseax0x64100要查看连续内存,可以使用GDB的“@”运算符查看连续内存。“@”的左侧是第一个内存的地址值,“@”右侧是要查看的内存长度。U表示从当前地址请求的字节数。默认值为4字节。当您使用display设置了一个或多个表达式时,只要程序停止,GDB将自动显示您设置的这些表达式的值。

查看栈信息

当程序被停住了,首先要确认的就是程序是在哪儿被断住的。这个一般是通过查看调用栈信息来看的。在gdb中,查看调用栈的命令是backtrace,可以简写为bt

(gdb) bt
#0 pop () at stack.c:10
#1 0x080484a6 in main () at main.c:12

也可以通过info stack命令实现类似的功能(我更喜欢这个命令):

(gdb) info stack
#0 pop () at stack.c:10
#1 0x080484a6 in main () at main.c:12

查看源程序

当程序断住是,gdb会显示当前断点的位置:

Breakpoint 1, pop () at stack.c:10
10 return stack[top--];

可以用list命令来查看当前断点附近的程序的源代码:

(gdb) list
5 int top = -1;
6
7
8 char pop(void)
9 {
10 return stack[top--];
11 }
12
13 void push(char c)
14 {

list命令后面还可以更一些参数,来显示更多功能:

  • <linenum>行号。
  • <+> [offset]当前行号的正偏移量。
  • <-> [offset] 当前行号的负偏移量。
  • <filename:linenum> 文件的中的行行。
  • <function> 函数的代码
  • <filename:function> 文件中的函数。
  • <*address> 程序运行时的语句在内存中的地址。

不过,就算有这些信息,查看代码仍然不大方便。现在新版的gdb都带一个tui的功能,可以通过focus命令开启,其主要界面如下:

Linux程序调试GDB——数据查看第1张

这个界面比起list来说方便多了,能高亮当前语句的执行位置,步进时也会跟着变化,有点使用Turbo C的感觉。

不知道是不是由于focus比较新的缘故,貌似网上并没有多少文章介绍它,虽然它比较容易上手,但也有不少可以介绍的地方,限于篇幅我这里就不做更多的说明,感兴趣的朋友可以看下gdb的gui用法这篇文章。

查看运行时数据

gdb中查看变量的命令是print,一般用它的简写形式p。它的语法如下:

print [</format>] <expr>

其中参数expr可以是一个变量,也可以是表达式。format表示输出格式,例如,可以用/x来将结果按16进制输出。如下是几个基本的例子:

(gdb) p top
$16 = 1
(gdb) p &top
$17 = (int *) 0x804a014 <top>
(gdb) p 3+2*5
$18 = 13
(gdb) p /x 3+2*5
$19 = 0xd

format的取值范围有如下几种:

  • x 按十六进制格式显示变量。
  • d 按十进制格式显示变量。
  • u 按十六进制格式显示无符号整型。
  • o 按八进制格式显示变量。
  • t 按二进制格式显示变量。
  • a 按十六进制格式显示变量。
  • c 按字符格式显示变量。
  • f 按浮点数格式显示变量。

查看函数返回值

查看函数返回值是在调试的过程中经常遇到的需求。例如,对于如下函数

intfoo()
{
return100;
}

我们可以以如下方式获取函数的返回值:

1. 通过finish命令运行至函数结束,此时会打印函数返回值。

(gdb) finish
Run till exit from #0 foo () at main.c:9
main () at main.c:15
15 }
Value returned is $2 = 100

2. 返回值会存储在eax寄存器中,通过查看信息可以获取返回值。

(gdb) p $eax
$3 = 100
(gdb) info registers
eax 0x64 100

查看连续内存

可以使用GDB的"@"操作符查看连续内存,"@"的左边是第一个内存的地址的值,"@"的右边则你你想查看内存的长度。

例如,对于如下代码:intarr[] = {2, 4, 6, 8, 10};,可以通过如下命令查看arr前三个单元的数据。

(gdb) p *arr@3
$2 = {2, 4, 6}

查看内存

可以使用examine命令(简写为x)来查看内存地址中的值。x命令的语法如下所示:

x /<n/f/u> <addr>

  • n 表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
  • f 表示显示的格式,如果是字符串,则用s,如果是数字,则可以用i。
  • u 表示从当前地址往后请求的字节数,默认是4个bytes。(b单字节,h双字节,w四字节,g八字节)
  • <addr> 表示一个内存地址。

例如:以两字节为单位显示前面的那个数组的地址后32字节内存信息如下.

(gdb) x /16uh arr
0xbffff4cc: 2 0 4 0 6 0 8 0
0xbffff4dc: 10 0 34032 2052 0 0 0 0

自动显示

在VisualStudio中,可以通过监视窗口动态查看变量的值。在gdb中,也提供了类似的命令display,它的语法是:

display <expr>
display /<fmt> <expr>
display /<fmt> <addr>

expr是一个表达式,fmt表示显示的格式,addr表示内存地址。当你用display设定好了一个或多个表达式后,只要你的程序被停下来(单步跟踪时),GDB会自动显示你所设置的这些表达式的值。

几个相关的命令如下:

  • undisplay <dnums...>不显示dispaly
  • delete display [dnums]删除自动显示,不带dnums参数则删除所有自动显示,也支持范围删除,如: delete display 1,3-5
  • disable display <dnums...>使display失效
  • enable display <dnums...>恢复display
  • info display查看display信息

转载自:http://www.cnblogs.com/TianFang/archive/2013/01/21/2869474.html

免责声明:文章转载自《Linux程序调试GDB——数据查看》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇vue移动端点击一个元素缩小,松手的时候元素恢复正常最终作业下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

hello 内核模块

#ifndef __KERNEL__ # define __KERNEL__ #endif #ifndef MODULE # define MODULE #endif #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h>...

Linux下安装mysql和curl扩展

在安装好apache2+php5之后,现在又想装上个mysql5玩玩。 用源码安装好mysql5之后,发现原来在Linux想为php添加新扩展,不像在windows上面,去掉分号注释就行了的~ 在网上查询了很多资料,终于搞定,特写日记以示祝贺。 添加扩展的基本步骤: 1、进入php源代码目录:# cd /usr/ChenShao/php-5.3.1/...

Linux下如何生成core dump 文件(解决segment fault段错误的问题)

Linux下的C程序常常会因为内存访问等原因造成segment fault(段错误),如果此时core dump 的功能是打开的,在运行我们的可执行程序时就会生成一个名为core的文件,然后我们就可以用gdb对core文件来进行调式,还原发生错误的堆栈情况,这对于我们调试bug非常有帮助。 1. 使用  ulimit -a 可以察看当前系统core文件的大...

Linux 环境下 node 以及 jit 的简单环境配置说明

注意事项: 1. 注意这个包需要实时更新. 2. 更新时需要按照目录覆盖文件. 3. 谁负责谁治理的态度, 有更新,需要完整的进行覆盖安装. 建议先删除旧文件, 替换新文件. 4. 为了简单起见, 直接将部署文件放到了 /nodejs 这个目录下面 1. 解压缩文件到相应的路径, 如图示 建议方法为 直接将压缩包放到 / 目录下面 执行命令 t...

linux 查询管道过滤,带上标题字段

linux查询过滤, 带上标题字段例: 一个简单的查询 ps -e | grep httpd 上面经过grep 过滤后, 标题没了, 但是为了看上去更方便,有标题字段看起来更方便一些, 那么可以按下面的写法来实现 命令: ps -e | head -1;ps -e | grep httpd 看一下效果吧: 说明: head -1 就是取第一行 其...

批处理for命令详解(转)

FOR这条命令基本上都被用来处理文本,但还有其他一些好用的功能! 看看他的基本格式(这里我引用的是批处理中的格式,直接在命令行只需要一个%号)FOR 参数 %%变量名 IN (相关文件或命令) DO 执行的命令 参数:FOR有4个参数 /d /l /r /f 他们的作用我在下面用例子解释%%变量名 :这个变量名可以是小写a-z或者大写A-Z,他们区分大小写...