gdb 预备知识
1.gcc的-g选项
如果要使用gdb进行调试,必须在编译时在gcc中加入-g选项,使用参数 -g 表示将源代码调试信息编译到可执行文件中。
#include <stdio.h> int main(void) { int i = 1; i = i + 1; printf("i = %d\n",i); return 0; }
如果使用-g选项:
gcc -g main.c
$ gdb a.out
(gdb) b main
Breakpoint 1 at 0x4004fc: file main.c, line 5.
(gdb) r
Starting program: /home/yanwenjie/ctest/a.out
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff7ffa000
Breakpoint 1, main () at main.c:5
5 int i = 1;
(gdb) n
6 i = i + 1;
(gdb)
7 printf("i = %d\n",i);
(gdb)
i = 2
8 return 0;
(gdb)
2.上下移动调用栈 //不怎么熟悉,蛮有用的工具
frame 1
#include <stdio.h> void display(int i) { printf("i = %d\n",i); } int main(void) { int i = 1; i = i + 1; display(i); return 0; }
Breakpoint 1 at 0x4004ff: file main.c, line 5.
(gdb) frame
No stack.
(gdb) r
Starting program: /home/yanwenjie/ctest/a.out
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff7ffa000
Breakpoint 1, display (i=2) at main.c:5
5 printf("i = %d\n",i);
(gdb) frame
#0 display (i=2) at main.c:5
5 printf("i = %d\n",i);
(gdb) frame 0
#0 display (i=2) at main.c:5
5 printf("i = %d\n",i);
(gdb) frame 1
#1 0x0000000000400535 in main () at main.c:12
12 display(i);
#0 display (i=2) at main.c:5
5 printf("i = %d\n",i);
(gdb) up
#1 0x0000000000400535 in main () at main.c:12
12 display(i);
(gdb) down
#0 display (i=2) at main.c:5
5 printf("i = %d\n",i);
(gdb) bt
#0 display (i=2) at main.c:5
#1 0x0000000000400535 in main () at main.c:12
3.gdbinit
使用gdb调试程序的时候,有时候需要设定多个断点,重复执行某些操作,而这些操作写起来比较麻烦,这时候可以使用gdbinit脚本。
如下脚本:
#filename: .gdbinit file a.out b display r
有两种方式来使用这个脚本:
1)启动gdb时候
gdb在启动的时候,会在当前目录下查找".gdbinit"这个文件,并把它的内容作为gdb命令进行解释,所以如果我把脚本命名为".gdbinit",
这样在启动的时候就会处理这些命令。
将脚本保存为.gdbinit,放在main.c同一目录下,执行gdb命令:
$ gdb
Breakpoint 1, display (i=2) at main.c:5
5 printf("i = %d\n",i);
(gdb)
2)gdb运行期间
可以使用 source script-file 来解释gdb命令脚本script-file
将脚本保存为gdbscript,放在main.c同一目录下:
$ gdb
(gdb) source gdbscript
Breakpoint 1 at 0x4004ff: file main.c, line 5.
Breakpoint 1, display (i=2) at main.c:5
5 printf("i = %d\n",i);
(gdb)