gdb(四)查看运行时数据和更改调试程序的执行路线和变量值等
2013-06-07 21:14
316 查看
一 查看运行时数据:
(一)print命令(p):查看当前程序的运行数据。(inspect类似)
*格式:print <expr>或print /<f> <expr>.
*expr是表达式;<f>是输出格式。
(二)程序变量:
(1)在gdb中可以查看三种变量的值:全局变量(所有文件可见)、局部变量(当前scope可见)和静态全局变量(当前文件可见)。
(2)局部变量会隐藏全局变量,如果需要查看全局变量的值需使用"::"。
*file::variable:哪个文件中的变量。
*function::variable:哪个函数中的变量。
*::variable:全局变量。
(3)注意:如果程序编译启动了优化选项,那么gdb调试被优化的程序时,可能发生某些变量不能访问或取得错误码,因为优化程序会删改你的程序,整理你程序的语句顺序,删除一些无意义的变量等。
(三) 数组:
(1)有时需查看一段连续的内存空间的值。比如:数组或是动态分配的数据的大小。
(2)方法:@左边是第一个内存的地址的值;@右边是你想查看内存的长度。
*查看数组元素:print *array@len
(四)输出格式:
(1)一般,GDB会根据变量类型输出变量的值,但你也可自定义GDB的输出格式。如:输出十进制数的十六进制格式。
(2)格式:print /<f> <expr>。
(3)f是输出格式:
*x:十六进制格式显示变量。
*d:十进制格式显示变量。
*u:十六进制格式显示无符号整型。
*o:八进制显示变量。
*t:二进制格式显示。
*a:十六进制格式显示变量。
*c:字符格式显示变量。
*f:浮点数格式显示变量。
(五)查看内存的值(x):
(1)使用x命令来查看内存地址中的值。
(2)格式:x/<n/f/u> <addr>。n,f,u是可选的参数。
*n:是一个正整数,表示显示内存的长度。
*f:表示显示格式。
*u:表示当前地址往后请求的字节数。
*addr:表示一个内存地址。
(3)help x:
(六)自动显示:
(1)可以设置一些自动显示的变量,当程序停住时,或是你在单步追踪时,这些变量会自动显示。
(2)display命令格式:
*display <expr>
*display /<fmt> <expr>
*display /<fmt> <addr>
*expr表示表达式;fmt表示显示格式;addr表示内存地址。
(3)help display:
(七)设置显示选项:
(1)help set print如下图:
(八)历史记录:
(1)当使用print查看程序运行时的数据时,你的每一个输出都会被GDB记录下来。GDB会以$1、$2、$3...这样的方式为你每一个print命令编上号。
(九)GDB环境变量(set):
(1)可以在GDB的调试环境中定义自己的变量,用来保存一些调试程序中的运行数据。
(2)格式:set $var=var1。
(3)show convenience:查看当前所设置的所有的环境变量。
(十)查看寄存器:
(1)info registers:查看寄存器的情况(除了浮点寄存器)。
(2)info all-registers:查看所有寄存器的情况。
(3)info registers <rename>:查看所指定的寄存器的情况。
二 更改调试程序的运行路线和变量值:
(一)修改变量值:
(1)print命令:print x=4
//把变量x的值修改为4。
(2)set 命令:set x=4 //同上。
(3)set var命令:set var x=4 //var告诉GDB,x不是你的参数,而是程序的变量名。
(二)跳转执行:
(1)GDB可以使用jump命令修改程序的执行顺序,让程序随意跳跃。
(2)格式:
*jump <linespec>:指定下一条语句的运行点。linespec:可以是行号;或file:line;或+num偏移量。
*jump <address>:address是代码行的内存地址。
(3)注意:jump不会改变当前程序栈中的内存,所有最好在同一个函数中进行跳转,否则,当跳转到的函数执行完后进行弹栈操作必然会发生错误。
(三) 产生信号量:
(1)使用signal命令,可以产生一个信号给被调试的程序。
(2)格式:signal <signal>。
(3)signal与shell的kill命令不同:系统kill发生的信号给被调试程序时,由GDB截获;signal命令发出的一个信号则是直接发给被调试程序的。
(四)强制函数返回(return):
(1)如果你的调试断点在某个函数中,并还有语句没有执行完,可以使用return命令强制函数忽略还没有执行的语句并返回。
(2)格式:
*return
*return <expression>:expression的值被当作函数的返回值。
(五) 强制调用函数(call):
(1)格式:call <expr>.
*expr是一函数,以此达到强制调用函数的目的。并显示函数返回值,如果返回值是void,不显示。
(2)help call:
(六)GDB语言环境:
(1)show language:显示当前的语言环境。
(2)info source:显示当前文件的程序语言。
(3)set language <argument>:设置当前的程序语言。
(4)如下图:
(一)print命令(p):查看当前程序的运行数据。(inspect类似)
*格式:print <expr>或print /<f> <expr>.
*expr是表达式;<f>是输出格式。
(二)程序变量:
(1)在gdb中可以查看三种变量的值:全局变量(所有文件可见)、局部变量(当前scope可见)和静态全局变量(当前文件可见)。
(2)局部变量会隐藏全局变量,如果需要查看全局变量的值需使用"::"。
*file::variable:哪个文件中的变量。
*function::variable:哪个函数中的变量。
*::variable:全局变量。
(3)注意:如果程序编译启动了优化选项,那么gdb调试被优化的程序时,可能发生某些变量不能访问或取得错误码,因为优化程序会删改你的程序,整理你程序的语句顺序,删除一些无意义的变量等。
(三) 数组:
(1)有时需查看一段连续的内存空间的值。比如:数组或是动态分配的数据的大小。
(2)方法:@左边是第一个内存的地址的值;@右边是你想查看内存的长度。
*查看数组元素:print *array@len
(四)输出格式:
(1)一般,GDB会根据变量类型输出变量的值,但你也可自定义GDB的输出格式。如:输出十进制数的十六进制格式。
(2)格式:print /<f> <expr>。
(3)f是输出格式:
*x:十六进制格式显示变量。
*d:十进制格式显示变量。
*u:十六进制格式显示无符号整型。
*o:八进制显示变量。
*t:二进制格式显示。
*a:十六进制格式显示变量。
*c:字符格式显示变量。
*f:浮点数格式显示变量。
(五)查看内存的值(x):
(1)使用x命令来查看内存地址中的值。
(2)格式:x/<n/f/u> <addr>。n,f,u是可选的参数。
*n:是一个正整数,表示显示内存的长度。
*f:表示显示格式。
*u:表示当前地址往后请求的字节数。
*addr:表示一个内存地址。
(3)help x:
(六)自动显示:
(1)可以设置一些自动显示的变量,当程序停住时,或是你在单步追踪时,这些变量会自动显示。
(2)display命令格式:
*display <expr>
*display /<fmt> <expr>
*display /<fmt> <addr>
*expr表示表达式;fmt表示显示格式;addr表示内存地址。
(3)help display:
(七)设置显示选项:
(1)help set print如下图:
(八)历史记录:
(1)当使用print查看程序运行时的数据时,你的每一个输出都会被GDB记录下来。GDB会以$1、$2、$3...这样的方式为你每一个print命令编上号。
(九)GDB环境变量(set):
(1)可以在GDB的调试环境中定义自己的变量,用来保存一些调试程序中的运行数据。
(2)格式:set $var=var1。
(3)show convenience:查看当前所设置的所有的环境变量。
(十)查看寄存器:
(1)info registers:查看寄存器的情况(除了浮点寄存器)。
(2)info all-registers:查看所有寄存器的情况。
(3)info registers <rename>:查看所指定的寄存器的情况。
二 更改调试程序的运行路线和变量值:
(一)修改变量值:
(1)print命令:print x=4
//把变量x的值修改为4。
(2)set 命令:set x=4 //同上。
(3)set var命令:set var x=4 //var告诉GDB,x不是你的参数,而是程序的变量名。
(二)跳转执行:
(1)GDB可以使用jump命令修改程序的执行顺序,让程序随意跳跃。
(2)格式:
*jump <linespec>:指定下一条语句的运行点。linespec:可以是行号;或file:line;或+num偏移量。
*jump <address>:address是代码行的内存地址。
(3)注意:jump不会改变当前程序栈中的内存,所有最好在同一个函数中进行跳转,否则,当跳转到的函数执行完后进行弹栈操作必然会发生错误。
(三) 产生信号量:
(1)使用signal命令,可以产生一个信号给被调试的程序。
(2)格式:signal <signal>。
(3)signal与shell的kill命令不同:系统kill发生的信号给被调试程序时,由GDB截获;signal命令发出的一个信号则是直接发给被调试程序的。
(四)强制函数返回(return):
(1)如果你的调试断点在某个函数中,并还有语句没有执行完,可以使用return命令强制函数忽略还没有执行的语句并返回。
(2)格式:
*return
*return <expression>:expression的值被当作函数的返回值。
(五) 强制调用函数(call):
(1)格式:call <expr>.
*expr是一函数,以此达到强制调用函数的目的。并显示函数返回值,如果返回值是void,不显示。
(2)help call:
(六)GDB语言环境:
(1)show language:显示当前的语言环境。
(2)info source:显示当前文件的程序语言。
(3)set language <argument>:设置当前的程序语言。
(4)如下图:
相关文章推荐
- 用GDB调试程序(11)──查看运行时数据(2)-转
- 用GDB调试程序(10)──查看运行时数据(1)
- gdb调试程序之查看运行时数据
- gdb调试程序之查看运行时数据【五】
- 用GDB调试程序(10)──查看运行时数据(1)-转
- 用GDB调试程序──查看运行时数据
- Linux高级编程--04.GDB调试程序(查看数据)
- gdb 调试(查看运行时数据) 四
- gdb 调试(查看运行时数据)(五)
- Linux程序调试GDB——数据查看
- 【GDB调试学习笔记】GDB查看运行时数据
- Linux程序调试GDB——数据查看
- gdb调试无法查看变量值(gdb No symbol "var" in current co
- GDB调试 ---改变程序的执行
- 使用gdb调试运行时的程序小技巧
- GDB调试正在运行的程序
- 实验 3.1.5 查看代码中各数据存储位置 示例程序: mem_add.c 1. 在自己的机器上运行示例程序。 2. 分析实验结果,图示程序运行时各数据位置。
- 查看DEVC++程序运行的代码区、数据区、栈区、堆区的地址
- pycharm 如何程序运行后,仍可查看变量值?
- GDB调试(正在运行的程序)