全部博文(252)
分类: LINUX
2010-05-27 17:57:47
调用运行命令
命令 |
参数含义 |
说明 |
continue |
|
令程序继续运行 |
step |
|
单步步入 |
next |
|
单步步过 |
finish |
|
执行到当前函数代码直到函数返回 |
until |
|
跳出循环,让程序一直执行,直到到达比发出until命令时所在源代码行号更大的位置 |
stdpi |
|
指令级单步步入 |
nexti |
|
指令级单步步出 |
print /f expr |
要打印的表达式。其中f 可以是 x十六进制 d 十进制o八进制等等。 |
打印表达式的值,可指定打印格式 |
whatis |
|
查看变量数据类型的简要说明 |
ptype |
|
查看变量数据类型的详细说明 |
x/nfu addr |
要查看的内存地址 |
查看指定内存地址处的数据,可指定模式、长度等 |
Info registers |
|
查看CPU寄存器 |
补充:
Step命令,如果step命令将要运行的源代码行上有函数调用,那么step命令将导致GDB进入到被调用函数的内部。通常把step称为步入命令。这也是与next命令的区别。
其它命令:
命令 |
参数含义 |
说明 |
display |
|
设置自动显示列表,不带参数时显示列表中所有表达式 |
delete display dnums….. |
自动显示列表的ID号 |
删除自动显示列表 |
disable dislay dnums….. |
自动显示列表的ID号 |
禁用自动显示列表 |
enable display dnums….. |
自动显示列表的ID号 |
使用自动显示列表 |
info display |
|
显示自动显示列表中的表达式 |
show convenience |
|
显示快捷变量 |
macro expand expression |
包含宏定义的表达式 |
将表达式宏展示 |
info macro macroname |
宏定义的名字 |
查看宏定义的信息 |
generatre-core file |
|
产生转储文件 |
backtrace |
n 最内层的n个函数栈帧 -n 最外层n个函数栈帧 |
栈帧回溯 |
frame |
栈帧号或者内存地址 |
选定栈帧,不带参数时显示栈帧简要信息 |
up |
栈帧号 |
选定栈帧上移 |
down |
栈帧号 |
选定栈帧下移 |
info frame |
|
显示栈帧详细信息 |
info agrs |
|
显示当前选定栈帧的函数参数 |
info locals |
|
显示当前选定栈帧中的所有局部变量 |
set variable expr |
赋值表达式 |
给变量赋值或者修改变量的值 |
print |
赋值表达式 |
给变量赋值或者修改变量的值 |
jump |
|
使程序从另外的地址开始执行 |
signal sig |
信号值或者信号和名称 |
向被调试程序发送信号 |
call expr |
包含函数调用的表达式 |
调用函数 |
print expr |
包含函数调用的表达式 |
调用函数 |
list |
函数名 行号 地址 偏移等 |
列出程序源码 |
set listsize count |
|
设置 list默认显示的行数 |
disassemble |
|
反汇编被调试程序 |
set disassembly-flavor instruction-set |
|
设置反汇编格式 |
自动显示列表,当需要频繁地检查一个表达式的值时,如想搞清楚某个变量的值是如何变化的,那么就应当考虑把它加到GDB的自动显示列表中。在GDB中,每次当被调试的程序因为断点,单步或者任何其他原因暂停执行时,GDB都将打印出自动显示列表中的表达式的值。
快捷变量是一种无类型的量,当它没有保存任何值时为void,快捷变量以$开头。由于在程序运行过程中变量的值是随时变化的,因此,快捷变量最常用的用途就是用来保存变量在从前的某个时刻的值,为后面分析变量的变化情况等工作提供参考。
这里解释一下什么是栈帧,函数是C语言基本的模块单位,每次当函数执行时,函数的相关信息都将保存到进程的栈空间中。与函数执行相关的信息包括函数调用在程序源文件中所对应的位置、函数的调用参数,以及函数的局部变量等。第一次当发生一个函数调用时,与变个函数有关的这些停下都将保存到栈空间中的一个数据块中。和一个函数就对应栈空间中的一个数据块,通常把这些用来保存函数调用相关信息的数据块称做栈帧(Stack frame),当程序因为断点暂停执行时,就可以通过相应的GDB命令查看栈帧中的这些信息。从而可以了解函数的执行情况,通常也把栈帧简称为帧。
当被调试程序开始执行以后,GDB就会存在一个选定的栈帧,通常情况下这个栈帧也就是当前下在执行的函数的栈帧,也可以通过GDB命令来选定其他栈帧。当使用print命令查看局部变量时,就是在当前选定的栈帧中查找这个局部变量。
当程序开始执行时,在栈空间中一开始只存在一个栈帧,这个栈帧就是main()函数,main()函数的这个栈帧也常常被称为初始栈帧或最外层栈帧。每次当一个新的函数被调用时,就会开成一个新的栈帧,而当一个被调用的函数返回后,就会从栈空间中去掉这个栈帧。
当函数的调用层次比较多时,就会形成一个连续的栈帧,假设现在main()函数中调用了foo()函数,而foo()函数中也调用了bar()函数,那么程序在bar()中暂停时形成的栈帧如下图所示。
通常把main()函数称为最内层的帧,bar()函数称为最外层的帧。Main()函数对应的栈帧号最大。可以通过-fomit-frame-pointer来决定是否启动,在可执行代码生成函数的栈帧地址指针。