工具程序gdb是GNU调试器。为了能调试程序,编译时必须指定GCC的-g选项将源码与可执行代码联系起来。
将程序载入调试器
fibonacci.c
int current;
int next;
int nextnext;
void setstart(void) {
current = 0;
next = 1;
}
void calcnext(void) {
nextnext = current + next;
current = next;
next = nextnext;
}
int main(int argc, char *argv[]) {
int i;
setstart();
for (i = 0; i < 20; i++) {
printf("%2d: %d\n", i+1, current);
calcnext();
}
return(0);
}
$ gcc -g fibonacci.c -o fibonacci \\ -g选项使得编译后的程序包含调试信息
breakpoints(断点)
当进程执行时,会中断在断点对应的行上。可根据行号、程序名、内存地址设置断点。
(gdb) break 20 // 设置断点(在行号为20处)
Breakpoint 17 at 0x8048479: file fibonacci.c, line 20.
(gdb) break main // 设置断点(在main函数开始处)
Breakpoint 18 at 0x804846a: file fibonacci.c, line 18.
(gdb) info address main // 查看地址(在main函数开始处)
Symbol "main" is a function at address 0x8048461.
(gdb) break *0x8048461 // 设置断点(在0x8048461地址处)
Breakpoint 19 at 0x8048461: file fibonacci.c, line 16.
(gdb) info breakpoints // 查看断点
Num Type Disp Enb Address What
17 breakpoint keep y 0x08048479 in main at fibonacci.c:20
18 breakpoint keep y 0x0804846a in main at fibonacci.c:18
19 breakpoint keep y 0x08048461 in main at fibonacci.c:16
(gdb) ignore 5 3 // 忽略断点(忽略Num=5的断点3次触发)
Will ignore next 3 crossings of breakpoint 5.
(gdb) delete 5 // 删除断点(断点列表中Num=5)
(gdb) clear main // 清除断点(main函数开始处)
(gdb) clear 20 // 清除断点(在行号为20处)
(gdb) enable 5