GDB查看数据
使用 GDB 调试程序时,需要经常的获取程序中的一些值,根据这些值的变化可以分析出程序运行时的情况,下面是对获取数据命令的一些详细的介绍。
实例:程序中定义一个变量 a 的值为 3。使用 print 命令打印:
当程序中的全局变量和局部变量发生冲突(重名)时,使用 print 命令打印的是局部变量的值,而全局变量会被隐藏。如果想要查看全局变量的值,需要使用操作符“::”指定。
打印程序中的全局变量的值,命令格式如下:
例如:程序中初始化一个整型的数组 arr。
print命令
获取程序中的数据使用 print 命令,通过该命令可以打印程序中表达式的值,命令格式:print [form] [expression]
其中 expression 表示的是程序的表达式,既然是一个表达式(以 C/C++ 语言为例介绍),那么它可以表示的种类有很多,例如,当前程序运行中的 const 常量、变量、函数等内容,但是不能表示程序中定义的宏。form 表示打印的格式,常见的有二进制 /t、八进制 /o、十六进制 /x、无符号整型 /u、带符号整形 /d 等。实例:程序中定义一个变量 a 的值为 3。使用 print 命令打印:
(gdb) print a
$1 = 3 //打印变量的值。
(gdb) print /x a
$2 = 0x3 //十六进制打印变量的值。
(gdb) print /t a
$3 = 11 //二进制打印变量的值。
查看程序中的变量
GDB调试程序,当程序运行时,我们可以查看的以下三种变量的值:- 全局变量(所有文件可见的)
- 静态全局变量(当前文件可见的)
- 局部变量(当前Scope可见的)
当程序中的全局变量和局部变量发生冲突(重名)时,使用 print 命令打印的是局部变量的值,而全局变量会被隐藏。如果想要查看全局变量的值,需要使用操作符“::”指定。
打印程序中的全局变量的值,命令格式如下:
print file :: var
打印某个函数体内定义的局部变量,命令格式如下:print function :: var
注意:如果调试的程序是经过优化的,那么有些变量的值可能是不能访问的,这个属于正常的情况。因为优化程序会对原来的程序进行删改,还会整理程序的语句顺序,删除程序中一些没有必要的变量。所以使用 GDB 调试这种程序时,运行时的指令和我们编写指令就会不一样,当然出现的结果我们也可能想象不到。对于这种情况,需要在编译程序时关闭编译优化。
实例:我们的程序中定义一个全局变量 b 的值为10;定义一个局部变量 b 的值为21。
(gdb) print b
$1 = 21 //打印的是局部变量的值
(gdb) print ::b
$2 = 10 //打印的是全局变量的值
查看程序中的数组
当需要查看一段连续的内存空间的值,比如数组中的某一段,或是动态分配内存的大小可以使用GDB的“@”操作符,“@”的左边是第一个内存的地址的值,“@”的右边则你你想查看内存的长度。例如:程序中初始化一个整型的数组 arr。
int arr[10]= {0,1,2,3,4,5,6,7,8,9};
(gdb) print *arr@10 //查看整个数组。
$3 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
(gdb) print arr[3]@6 //查看从arr[3]~arr[8],数组中的某一段。
$3 = {3, 4, 5, 6, 7, 8}
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算