GDB拾忆之二

来源:互联网 发布:unity3d 材质球下载 编辑:程序博客网 时间:2024/04/24 18:45
1>查看运行时数据
利用print命令可以检查各个变量的值。
print/p <varable-name>
在gdb中,可以随时查看全局变量(所有文件可见的),静态全局变量(当前文件可见的),和局部变量(当前Scope可见的)这3种变量的值。
如果局部变量和全局变量发生冲突,一般情况下是局部变量会隐藏全局变量。如果一个全局变量和一个函数中的局部变量同名时,且当前停止点在函数中,用print显示出的变量的值会是函数中的局部变量的值。此时查看全局变量的值或位于其他文件或其他函数的变量值时,可以使用"::" 操作符
print<file::variable>
print<function::variable>
例:p 'f2.c'::x
    p 'f2.c'::sum::x

2>对程序中函数的调用 print func(arg1,arg2,...)
查看表达式的值  print <expression> 例:print a - b
查看数组的值 print <array-name>
查看运行动态数组的值 print *数组名首地址@len

3>变量的输出格式
原格式 p 变量名
十六进制 p/a 变量名
字符格式显示 p/c 变量名
浮点数格式显示 p/f i
二进制格式 p/t i
... ... 

4> 查看内存 examine命令,简写x来查看内存地址
x /nfu <address>
nfu为可选参数:
n是一个正整数,表示显示内存的长度,即指定从当前地址向后显示几个单位的内容。f表示显示格式,如果显示的是字符串那么格式可以是s。如果是指令地址,那么格式可以是i。u表示从当前地址向后请求的字节数。如果不指定,gdb默认是4个b。u可以用这些字符来代替:    b表示单字节;h表示双字节,w表示4字节,g表示8字节。

5>自动显示变量

display/fmt expr

expr是一个表达式,fmt表示显示的格式(和命令x的参数一样),当用display设定好了一个或多个表达式后,程序一旦停止,gdb会自动显示所设置的表达式的值。
info display 查看display设置的自动显示的信息。
删除所有自动显示:undisplay
删除自动显示,delete display <dnums>
disable display <dnums> //禁用
enable display <dnums>  //启用
disable和enable 不删除自动显示的设置,而只是让其失败和恢复。

希望所有条目失效/恢复,可以直接输入如下命令:
disable display
enable display

6> 查看寄存器
查看寄存器情况  info registers
查看所有寄存器情况 info all-registers
查看所指定的寄存器的情况 info registers <register-name>

7>改变程序的执行
修改变量的值  print <expr> 或者 set <expr>
之后使用continue

跳转执行 jump
jump <location>

8>信号的产生及处理
使用signal命令,可以产生一个信号给被调试的程序。在任意位置设置断点,并在断点用gdb产生一个信号,精确调试程序。
signal <signum> UNIX 系统信号通常是从1~15.kill命令信号是被调试程序GDB截获的,而signal命令发出的信号是直接发给被调试程序的。

handle命令控制信号的处理,格式:handle <sig-name> <whatodo>
它有两个参数,一个是信号名(sig-name),另一个是接受到信号时该做什么
nostop:接收到信号时,不要将它发送给程序,也不要停止程序。
stop: 接收到信号时停止程序的执行,从而允许程序调试;显示一条表示已接收到信号的消息。
print: 接收到信号时显示一条信息
noprint: 接收到信号时不显示信息
pass: 将信号发送给程序,从而允许程序去处理它,停止运行或采取其他的动作。
nopass: 停止程序运行,但不要将信号发送给程序。
例: handle SIGPIPE stop print

9>强制调用函数
强制函数调用命令call,功能及用法和print相同
call func(arg1,arg2,...)
print和call的区别是,如果函数返回void,call不显示,print显示发挥至,并把改值存入历史数据中。

10>强制函数返回
return <value>

0 0