GDB调试
第一部分 命令行和使用方法
gdb常用命令在下表列出:
启动GDB的方法有以下几种:
1、gdb <program>
program也就是你的执行文件,一般在当然目录下。
2、gdb <program> core
用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。
3、gdb <program> <PID>
如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上
gdb
<program> 其中<program>目录或环境变量下必须有<program>.c文件,否则找不到源码
(gdb) l
16 demo.c: No such file or directory.
尽管找不到源码,仍然可以调试,只是没有list源码进行比较
二、设置观察点(WatchPoint)
观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序。我们有下面的几种方法来设置观察点:
watch <expr>
为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。
rwatch <expr>
当表达式(变量)expr被读时,停住程序。
awatch <expr>
当表达式(变量)的值被读或被写时,停住程序。
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发生时,停住程序。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 <libname> 载入共享库(动态链接库)时。(load为关键字,目前此功能只在HP-UX下有用)
7、unload 或 unload <libname> 卸载共享库(动态链接库)时。(unload为关键字,目前此功能只在HP-UX下有用)
tcatch <event>
只设置一次捕捉点,当程序停住以后,应点被自动删除。
第二部分 调试多线程
第三部分 调试内核