GDB调试
第一部分 命令行和使用方法
gdb常用命令在下表列出:
命令
|
描述
|
backtrace(或bt)
|
查看各级函数调用及参数
|
finish
|
连续运行到当前函数返回为止,然后停下来等待命令
|
frame(或f)
|
帧编号 选择栈帧
|
info(或i)
|
locals 查看当前栈帧局部变量的值
|
list(或l)
|
列出源代码,接着上次的位置往下列,每次列10行
|
list 行号
|
列出从第几行开始的源代码
|
list 函数名
|
列出某个函数的源代码
|
start
|
开始执行程序,停在main函数第一行语句前面等待命令
|
next(或n)count
|
执行下一行语句(有函数默认跳过)
|
step(或s)count
|
执行下一行语句,如果有函数调用则进入到函数中
|
run
|
继续执行到断点位置
|
nexti和stepi命令
|
用来单步执行一条机器指令,通常一条语句有多条机器指令构成的。
|
print(或p)
|
打印表达式的值,通过表达式可以修改变量的值或者调用函数
|
quit(或q)
|
退出gdb调试环境
|
set var
|
修改变量的值
|
clear
|
删除程序中所有的断点
|
clear 行号
|
删除此行中的断点
|
clear 函数名
|
删除该函数的断点
|
break +offset
break -offset
|
在当前行号的前面或后面的offset行停住。offiset为自然数。
|
break filem.c:1000
|
多文件设置断点,在filem.c的第1000行设置断点
|
set args
show args
|
可指定运行时参数。(如:set args 10 20 30 40 50)
|
info program
|
查看程序的是否在运行,进程号,被暂停的原因
|
ignore
|
表示忽略断点号为bnum的停止条件count次
|
启动GDB的方法有以下几种:
program也就是你的执行文件,一般在当然目录下。
用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。
如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上
gdb
其中目录或环境变量下必须有.c文件,否则找不到源码
(gdb) l
16 demo.c: No such file or directory.
尽管找不到源码,仍然可以调试,只是没有list源码进行比较
二、设置观察点(WatchPoint)
观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序。我们有下面的几种方法来设置观察点:
watch
为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。
rwatch
当表达式(变量)expr被读时,停住程序。
awatch
当表达式(变量)的值被读或被写时,停住程序。
info watchpoints
列出当前所设置了的所有观察点。
watch p 是查看 *(&p), 是p 变量本身。
watch (*p) 是 p 所指的内存的内容, 查看地址,一般是我们所需要的。
我们就是要看莫地址上的数据是怎样变化的,虽然这个地址具体位置只有编译器知道。
c. watch 一个数组或内存区间
char buf[128], watch buf,
是对buf 的128个数据进行了监视. 此时不是采用硬件断点,而是软中断实现的。
软中断方式去检查内存变量是比较耗费cpu资源的。
在使用watch时
步骤如下
:
1. 使用break在要观察的变量所在处设置断点;
2. 使用run执行,直到断点;
3. 使用watch设置观察点;
4. 使用continue观察设置的观察点是否有变化。
demo:
(gdb) b 16
Breakpoint 7 at 0x804841a: file demo.c, line 16.
(gdb) c
Continuing.
Breakpoint 7, add_range (low=1, high=46) at demo.c:16
16 int i, sum=0;
(gdb) watch i
Hardware watchpoint 8: i
(gdb) c
Continuing.
Hardware watchpoint 8: i
Old value = 0
New value = 1
0x08048427 in add_range (low=1, high=46) at demo.c:17
17 for (i = low; i <= high; i++)
三、设置捕捉点(CatchPoint)
你可设置捕捉点来补捉程序运行时的一些事件。如:载入共享库(动态链接库)或是C++的异常。设置捕捉点的格式为:
catch
当event发生时,停住程序。event可以是下面的内容:
1、throw 一个C++抛出的异常。(throw为关键字)
2、catch 一个C++捕捉到的异常。(catch为关键字)
3、exec 调用系统调用exec时。(exec为关键字,目前此功能只在HP-UX下有用)
4、fork 调用系统调用fork时。(fork为关键字,目前此功能只在HP-UX下有用)
5、vfork 调用系统调用vfork时。(vfork为关键字,目前此功能只在HP-UX下有用)
6、load 或 load 载入共享库(动态链接库)时。(load为关键字,目前此功能只在HP-UX下有用)
7、unload 或 unload 卸载共享库(动态链接库)时。(unload为关键字,目前此功能只在HP-UX下有用)
tcatch
只设置一次捕捉点,当程序停住以后,应点被自动删除。
第二部分 调试多线程
第三部分 调试内核