标签:
http://www.cnblogs.com/TianFang/archive/2013/01/21/2869474.html
http://www.cnblogs.com/evasnowind/archive/2010/11/07/1871324.html
在使用gdb前,必须先载入可执行文件,因为要进行调试,文件中就必须包含调试信息,所以在用gcc或cc编译时就需要用-g参数来打开程序的调试选项。
调试开始时,必须先载入要进行调试的程序,可以用以下两种方式:
* 在启动gdb后执行以下命令:
file 可执行文件路径
* 在gdb启动时就载入程序:
gdb 可执行文件路径
常用命令如下表:
命令 | 使用格式 | 备注 |
list | list | 输出从上次调用list命令开始往后的10行程序代码 |
list - | 输出从上次调用list命令开始往前的10行程序代码 | |
list n | 输出第n行附近的10行程序代码 | |
list function | 输出函数function前后的10行程序代码 | |
forward-search | forward-search 字符串 | 从当前行向后查找匹配某个字符串的程序行, 查找到的行号将保存在$_变量中, 可以用print $_命令来查看 |
reverse-search | reverse-search 字符串 | 和forward-search相反,向前查找字符串 |
break | break 要设置断点的行号 | 在程序中设置断点,当程序运行到指定行上时,会暂停执行 |
tbreak | tbreak 要设置临时断点的行号 | 设置临时断点,在设置之后只起作用一次 |
clear | clear 要清除的断点所在的行号 | 和break相反,clear用于清除断点 |
info break | info break | 列出设置过的断点 |
run | run | 启动程序,在run后面带上参数可以传递给正在调试的程序 |
awatch | awatch 变量或表达式 | 用来增加一个观察点(add
watch), 当表达式的值发生改变或表达式的值被读取时,程序就会停止运行 |
watch | watch 变量或表达式 | 与awatch类似用来设置观察点, 但程序只有当表达式的值发生改变时才会停止运行. 需要注意的是,awatch和watch都必须在程序运行的过程中设置观察点,即可运行run之后才能设置 |
commands | commands | 设置在遇到断点后执行特定的指令 |
commands n | 设置遇到断点号n时要执行的命令, 注意,commands后面跟的是断点号,而不是断点所在的行号。在输入命令后,就可以输入遇到断点后要执行的命令,每行一条命令,在输入最后一条命令后输入end就可以结束输入 |
|
delete | delete 断点号 | 清除断点或自动显示的表达式 |
disable | disable 断点号列表 | 让指定断点失效,断点号之间用空格间隔开 |
enable | enable 断点编号列表 | 和disable相反,恢复失效的断点 |
ignore | ignore 断点号 忽略次数 | 忽略断点 |
condition | condition 断点号 条件表达式 | 设置断点在一定条件下才能生效 |
cont/continue | cont | 跳过当前断点继续运行 |
cont n | 跳过n次断点,继续运行 | |
jump | jump 行号 | 让程序跳到指定行开始调试 |
next | next | 执行一条语句 |
next n | 执行n条语句 | |
step | step | 与next类似,但是它会跟踪到子程序的内部, 而且会显示子程序内部的执行情况 |
finish | finish | 跳出函数调用,运行至函数结束并打印函数返回值 |
whatis | whatis 变量或表达式 | 显示某个变量或表达式的数据类型 |
ptype | ptype 变量或表达式 | 和whatis类似,用于显示数据类型, 但是它还可以显示typedef定义的类型等 |
set | set 变量=表达式 | 设置程序中变量的值 |
display | display 表达式 | 增加要显示值的表达式 |
info display | info display | 显示当前所有的要显示值的表达式 |
delete display /undisplay |
delete display/undisplay 表达式编号 | 删除要显示值的表达式 |
disable display | disable display 表达式编号 | 暂时不显示一个要表达式的值 |
enable display | enable display 表达式编号 | 与disable display相反,使用表达式恢复显示 |
print 变量或表达式 | 打印变量或表达式的值 | |
backtrace/bt | backtrace 栈帧个数 | 打印指定个数的栈帧(stack frame) |
frame | frame 栈帧号 | 打印栈帧 |
info frame | info frame | 显示当前栈帧的详细信息 |
select-frame | select-frame 栈帧号 | 选择栈帧,选择后可以用info frame来显示栈帧信息 |
kill | kill | 结束当前程序的调试 |
quit | quit | 退出gdb |
set args | set args | 可指定运行时参数。(如:set args 10 20 30 40 50) |
show args | show args | 命令可以查看设置好的运行参数 |
__________________________________
查看运行时数据
gdb中查看变量的命令是print,一般用它的简写形式p。它的语法如下:
print [</format>] <expr>
其中参数expr可以是一个变量,也可以是表达式。format表示输出格式,例如,可以用/x来将结果按16进制输出。如下是几个基本的例子:
format的取值范围有如下几种:
查看函数返回值
查看函数返回值是在调试的过程中经常遇到的需求。例如,对于如下函数
int foo()
{
return 100;
}
我们可以以如下方式获取函数的返回值:
(gdb) finish
Run till exit from #0 foo () at main.c:9
main () at main.c:15
15 }
Value returned is $2 = 100
(gdb) p $eax
$3 = 100
(gdb) info registers
eax 0x64 100
查看连续内存
可以使用GDB的"@"操作符查看连续内存,"@"的左边是第一个内存的地址的值,"@"的右边则你你想查看内存的长度。
例如,对于如下代码:int arr[] = {2, 4, 6, 8, 10};,可以通过如下命令查看arr前三个单元的数据。
(gdb) p *arr@3
$2 = {2, 4, 6}
查看内存
可以使用examine命令(简写为x)来查看内存地址中的值。x命令的语法如下所示:
x /<n/f/u> <addr>
例如:以两字节为单位显示前面的那个数组的地址后32字节内存信息如下.
(gdb) x /16uh arr
0xbffff4cc: 2 0 4 0 6 0 8 0
0xbffff4dc: 10 0 34032 2052 0 0 0 0
自动显示
在VisualStudio中,可以通过监视窗口动态查看变量的值。在gdb中,也提供了类似的命令display,它的语法是:
display <expr>
display /<fmt> <expr>
display /<fmt> <addr>
expr是一个表达式,fmt表示显示的格式,addr表示内存地址。当你用display设定好了一个或多个表达式后,只要你的程序被停下来(单步跟踪时),GDB会自动显示你所设置的这些表达式的值。
几个相关的命令如下:
如要查看所有的gdb命令,可以在gdb下键入两次Tab(制表符),运行“help command”可以查看命令command的详细使用格式
新版的gdb都带一个tui的功能,可以通过focus命令开启,其主要界面如下:
这个界面比起list来说方便多了,能高亮当前语句的执行位置,步进时也会跟着变化,有点使用Turbo C的感觉。
不知道是不是由于focus比较新的缘故,貌似网上并没有多少文章介绍它,虽然它比较容易上手,下面是一些介绍:
简单来说就是在以往的gdb开始的时候添加一个-tui选项.有的版本已经有gdbtui这个程序了
在linux自带的终端里是正常显示的,但是在securecrt里面,可能由于编码的问题,边缘会有些乱码,不过不影响使用(如果你的程序有错误输出,会扰乱整个界面,所以在调试的时候,建议添加2>/dev/null,这样的话基本可用)
启动gdb之后,上面是src窗口,下面是cmd窗口,默认focus在src窗口的,这样的话上下键以及pagedown,pageup都是在移动显示代码,并不显示上下的调试命令.这个时候要切换focus,具体可简单参见
命令示例:
(gdb) info win 查看当前focus SRC (36 lines) <has focus> CMD (18 lines) (gdb) fs next 切换focus Focus set to CMD window. (gdb) info win SRC (36 lines) CMD (18 lines) <has focus> (gdb) fs SRC 切换指定focus Focus set to SRC window. (gdb)
(Window names are case in-sensitive.)
标签:
原文地址:http://www.cnblogs.com/feixiang927/p/5000923.html