Linux程序调试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命令开启,其主要界面如下:
这个界面比起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 按浮点数格式显示变量。
查看函数返回值
查看函数返回值是在调试的过程中经常遇到的需求。例如,对于如下函数
int foo()
{
return 100;
}
我们可以以如下方式获取函数的返回值:
(gdb) finish
Run till exit from #0 foo () at main.c:9
main () at main.c:15
15 }
Value returned is $2 = 100
(gdb) p $eax
$3 = 100
(gdb) info registers
eax 0x64 100
查看连续内存
可以使用GDB的"@"操作符查看连续内存,"@"的左边是第一个内存的地址的值,"@"的右边则你你想查看内存的长度。
例如,对于如下代码:int arr[] = {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——数据查看的更多相关文章
- linux程序调试命令addr2line之入门简单介绍(本文先不聊gdb调试)
addr2line有什么作用呢? 可别小瞧它, 它能够定位到代码出错的位置. 以下, 我们来看看这个简单的代码: #include <stdio.h> int main() { int * ...
- linux程序调试常用命令
1 调用跟踪 跟踪系统调用 strace ls –l 跟踪库调用 ltrace 2 lsof(list open file) 查看程序命令打开了哪些文件 lsof –p PID; lsof –c ...
- linux程序调试命令strace
strace命令用法详解: strace常用来跟踪进程执行时的系统调用和所接收的信号. 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须 ...
- RVMDK的DEBUG调试-实时数据查看
无论在Simulation还是硬件仿真的情况下,View-period windows update后watch窗口添加的变量即可实时更新, 软仿真和硬件仿真的区别就是实际时间的差异:如RTC查看秒的 ...
- 利用Xlinix SDK 建立Linux程序以及对该程序进行调试
一.创建Linux程序 1. 点击File > New > Application Project .并参照下图设置. 2. 输入工程名,并选择存储路径. 3. 选择所需的操作系统平台(O ...
- Linux上程序调试的基石(2)--GDB
3. GDB的实现 GDB是GNU发布的一个强大的程序调试工具,用以调试C/C++程序.可以使程序员在程序运行的时候观察程序在内存/寄存器中的使用情况.它的实现也是基于ptrace系统调用来完成的. ...
- 针对 Linux 环境下 gdb 动态调试获取的局部变量地址与直接运行程序时不一致问题的解决方案
基础的缓冲区溢出实践通常需要确定运行状态下程序中的某些局部变量的地址,如需要确定输入缓冲区的起始地址从而获得注入缓冲区中的机器指令的起始地址等.在 Linux 环境下,可通过 gdb 对程序进行动态调 ...
- Linux下用gdb 调试、查看代码堆栈
Linux中用gdb 查看代码堆栈的信息 core dump 一般是在segmentation fault(段错误)的情况下产生的文件,需要通过ulimit来设置才会得到的. 调试的话输入: gd ...
- Linux gcc和gdb程序调试用法 {转}
gcc一般调试格式: gcc -Wall -o test test.c // -wall 显示程序错误详细信息 gcc -v // 显示gcc的版本 gcc -o{1,2,3} t ...
随机推荐
- bzoj4034 树上操作
Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中 ...
- UML类图符号 各种关系说明以及举例(转载)
文章出处:http://www.cnblogs.com/duanxz/archive/2012/06/13/2547801.html UML中描述对象和类之间相互关系的方式包括:依赖(Dependen ...
- ubuntn 内核升级到LINUX v4.11.8:
升级到LINUX v4.11.8: http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.11.8/linux-headers-4.11.8-041108_ ...
- 让linux history命令显示命令的运行时间、在哪个机器运行的这个命令
1.在/etc/profile的最后加入例如以下部分: USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g ...
- 【spring】在spring cloud项目中使用@ControllerAdvice做自定义异常拦截,无效 解决原因
之前在spring boot服务中使用@ControllerAdvice做自定义异常拦截,完全没有问题!!! GitHub源码地址: 但是现在在spring cloud中使用@ControllerAd ...
- extjs 按条件查询出的数据在grid上不显示
在对extjs的按条件查询时.发现仅仅要输入查询条件时,grid上查询的结果就不显示,可是假设不输入条件默认查询全部的 时候就能显示数据.输入条件时后台查出来的数据时时正确的返回到json格式的数据也 ...
- U3D内存优化
原创文章如需转载请注明:转载自风宇冲Unity3D教程学院 U3D内存优化 读了Hog关于内存管理文章 ...
- [Android Studio] Android Studio移除的Module如何恢复(转载)
如果你执行了从module列表中移除module的操作,但是没有执行delete module文件夹的操作,那如何恢复被移除掉的module呢. 关于如何移除请戳这:Android Studio如何删 ...
- Spring+Mybatis+SpringMVC后台与前台分页展示实例(附工程)
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文实现了一个后台由Spring+Mybatis+SpringMVC组成,分页采用Pag ...
- 数学图形(2.7)sphere sine wave
在球上以SIN曲线的轨迹游走. #http://www.mathcurve.com/courbes3d/couronnetangentoidale/couronnetangentoidale.shtm ...