gdb(四)查看运行时数据和更改调试程序的执行路线和变量值等

一 查看运行时数据:

(一)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)如下图:

















展开阅读全文

没有更多推荐了,返回首页