【ACCESS精品源码栏目提醒】:网学会员在ACCESS精品源码频道为大家收集整理了“GDB的使用方法(下) ccvff - 计算机教材“提供大家参考,希望对大家有所帮助!
历史记录 当你用GDB的print查看程序运行时的数据时你每一个print都会被GDB记录下来。
GDB会以1 2 3 .....这样的方式为你每一个print命令编上号。
于是你可以使用这个编号访问以前的表达式如1。
这个功能所带来的好处是如果你先前输入了一个比较长的表达式如果你还想查看这个表达式的值你可以使用历史记录来访问省去了重复输入。
九、GDB环境变量 你可以在GDB的调试环境中定义自己的变量用来保存一些调试程序中的运行数据。
要定义一个GDB的变量很简单只需。
使用GDB的set命令。
GDB的环境变量和UNIX一样也是以起头。
如 set foo object_ptr 使用环境变量时GDB会在你第一次使用时创建这个变量而在以后的使用中则直接对其赋值。
环境变量没有类型你可以给环境变量定义任一的类型。
包括结构体和数组。
show convenience 该命令查看当前所设置的所有的环境变量。
这是一个比较强大的功能环境变量和程序变量的交互使用将使得程序调试更为灵活便捷。
例如 set i 0 print bari-contents 于是当你就不必print bar0-contents print bar1-contents地输入命令了。
输入这样的命令后只用敲回车重复执行上一条语句环境变量会自动累加从而完成逐个输出的功能。
十、查看寄存器 要查看寄存器的值很简单可以使用如下命令 info registers 查看寄存器的情况。
除了浮点寄存器 info all-registers 查看所有寄存器的情况。
包括浮点寄存器 info registers 查看所指定的寄存器的情况。
寄存器中放置了程序运行时的数据比如程序当前运行的指令地址ip程序的当前堆栈地址sp等等。
你同样可以使用print命令来访问寄存器的情况只需要在寄存器名字前加一个符号就可以了。
如p eip。
改变程序的执行 一旦使用GDB挂上被调试程序当程序运行起来后你可以根据自己的调试思路来动态地在GDB中更改当前被调试程序的运行线路或是其变量的值这个强大的功能能够让你更好的调试你的程序比如你可以在程序的一次运行中走遍程序的所有分支。
一、修改变量值 修改被调试程序运行时的变量值在GDB中很容易实现使用GDB的print命令即可完成。
如 gdb print x4 x4这个表达式是C/C的语法意为把变量x的值修改为4如果你当前调试的语言是Pascal那么你可以使用Pascal的语法x:4。
在某些时候很有可能你的变量和GDB中的参数冲突如 gdb whatis width type double gdb p width 4 13 gdb set width47 Invalid syntax in expression. 因为set width是GDB的命令所以出现了“Invalid syntax in expression”的设置错误此时你可以使用set var命令来告诉GDBwidth不是你GDB的参数而是程序的变量名如 gdb set var width47 另外还可能有些情况GDB并不报告这种错误所以保险起见在你改变程序变量取值时最好都使用set var格式的GDB命令。
二、跳转执行 一般来说被调试程序会按照程序代码的运行顺序依次执行。
GDB提供了乱序执行的功能也就是说GDB可以修改程序的执行顺序可以让程序执行随意跳跃。
这个功能可以由GDB的jump命令来完 jump 指定下一条语句的运行点。
可以是文件的行号可以是file:line格式可以是num这种偏移量格式。
表式着下一条运行语句从哪里开始。
jump 这里的是代码行的内存地址。
注意jump命令不会改变当前的程序栈中的内容所以当你从一个函数跳到另一个函数时当函数运行完返回时进行弹栈操作时必然会发生错误可能结果还是非常奇怪的甚至于产生程序Core Dump。
所以最好是同一个函数中进行跳转。
熟悉汇编的人都知道程序运行时有一个寄存器用于保存当前代码所在的内存地址。
所以jump命令也就是改变了这个寄存器中的值。
于是你可以使用“set pc”来更改跳转执行的地址。
如 set pc 0x485 三、产生信号量 使用singal命令可以产生一个信号量给被调试的程序。
如中断信号CtrlC。
这非常方便于程序的调试可以在程序运行的任意位置设置断点并在该断点用GDB产生一个信号量这种精确地在某处产生信号非常有利程序的调试。
语法是signal UNIX的系统信号量通