标签:
GDB是一个强大的GNU Project调试器。通过gdb你能够查看另一个程序的执行过程,或者当程序崩溃时正在做什么事情。
GDB主要通过以下4个方面来帮助你找出程序中的bug:
现在,GDB可以调试用Ada, C, C++, Objective-C, Pascal等语言编写的程序。而且GDB支持本机(native)调试和远程(remote)调试。
一. gdb的基本使用
首先通过一个例子来介绍gdb的使用和命令:
程序名:main.c
#include <stdlib.h>
#include <stdio.h>
void fa()
{
int a = 0;
int loop = 10;
while(loop--){
sleep(1);
printf("a = %d\n", a++);
}
}
void fb()
{
fa();
}
int main(int argc, char **argv)
{
int m;
char *str="hello world\n";
printf("%s",str);
m = 1;
m = 2;
fb();
return 0;
}
编译时必须加-g选项,否则编译出来的可执行文件没有debug符号,我们在debug时候就看不到源代码了。
编译命令: gcc -g main.c
编译出来的可执行文件默认命名为a.out
1. 开始调试
一般情况下,直接通过指定可执行程序作为gdb的参数来启动调试:
$gdb program
或者在gdb启动后,使用file 可执行程序 来加载被调试程序
(gdb)file program
也可以直接调试指定的进程:
$gdb -p process_id
[root@ubuntu:~]$ gdb a.out
GNU gdb (Ubuntu 7.7-0ubuntu3.1) 7.7
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./a.out...done.
(gdb)
2. 添加断点
break:(可简写为 b)
break [function name] 给某个函数设置断点
break [line number] 给某一行添加断点
break [+offset / -offset] 给当前行号的正/负偏移添加端点
break [filename: line number] 在某个文件的那行添加端点
break [*address] 在程序中的某个地址设置端点
break ... if [condition] 当condition满足时,程序停止
例如
(gdb) b main
Breakpoint 1 at 0x80484ad: file main.c, line 22.
(gdb) b 6
(gdb) b *0x8048497
Breakpoint 2 at 0x8048497: file main.c, line 15.
(gdb) break fb if loop=90 //断点设置在fb函数中,当loop==90时,程序停止
3. 查看断点
info b
(gdb) info b
Num Type Disp Enb Address What
1 breakpoint keep y 0x080484ad in main at main.c:22
2 breakpoint keep y 0x08048453 in a at main.c:6
4. 运行
run
运行程序,知道遇到断点停止
c
当程序停止时,执行c继续运行程序
next
单步执行程序,遇到函数会直接执行过该函数,不会进入
step
单步执行程序,遇到函数会进入函数执行
until
Execute until the program reaches a source line greater than the current
or a specified location (same args as break command) within the current frame.
finish
运行直到当前的栈返回。一般用于跳出当前执行的函数
5. 显示原码 list
list [line number]
list [filename: line number]
list [+offset]
list [-offset]
list [function]
list [filename: function]
list [*address]
6.watchpoint
watchpoint用来指定表达式或变量在程序执行过程中是否有变动,如果有变动则程序停止。
watch
为表达式中的变量设置一个watchpoint
rwatch
当表达式中变量被读时,程序停止
awatch
当表达式中变量被读或被写时,程序停止
info watchpoints
列出当前设置的所有watchpoint
例如:
(gdb) awatch m
Hardware access (read/write) watchpoint 2: m
7. bt
查看程序运行是的栈信息
(gdb) bt
#0 0xb7fdd424 in __kernel_vsyscall ()
#1 0xb7ec9340 in __nanosleep_nocancel ()
at ../sysdeps/unix/syscall-template.S:81
#2 0xb7ec910d in __sleep (seconds=0) at ../sysdeps/unix/sysv/linux/sleep.c:137
#3 0x0804846f in fa () at main.c:9
#4 0x080484a2 in fb () at main.c:16
#5 0x080484de in main (argc=1, argv=0xbffff6b4) at main.c:26
8. 打印
打印输出变量的值
print val
标签:
原文地址:http://www.cnblogs.com/veryon/p/4264977.html