backtrace
显示程序中的当前位置和表示如何到达当前位置的栈跟踪(同义词:where)?
breakpoint
在程序中设置一个断点?
cd
改变当前工作目录?
clear
删除刚才停止处的断点?
commands
命中断点时,列出将要执行的命令?
continue
从断点开始继续执行?
delete
删除一个断点或监测点;也可与其他命令一起使用?
display
程序停止时显示变量和表达时?
down
下移栈帧,使得另一个函数成为当前函数?
frame
选择下一条continue命令的帧?
info
显示与该程序有关的各种信息?
jump
在源程序中的另一点开始运行?
kill
异常终止在gdb
控制下运行的程序?
list
列出相应于正在执行的程序的原文件内容?
next
执行下一个源程序行,从而执行其整体中的一个函数?
print
显示变量或表达式的值?
pwd
显示当前工作目录?
pype
显示一个数据结构(如一个结构或C++类)的内容?
quit
退出gdb?
reverse-search
在源文件中反向搜索正规表达式?
run
执行该程序?
search
在源文件中搜索正规表达式?
set
variable 给变量赋值?
signal
将一个信号发送到正在运行的进程?
step
执行下一个源程序行,必要时进入下一个函数?
undisplay
display命令的反命令,不要显示表达式?
until
结束当前循环?
up
上移栈帧,使另一函数成为当前函数?
watch
在程序中设置一个监测点(即数据断点)?
whatis
显示变量或函数类型?
?
?
******gdb
使用范例************************?
-----------------?
清单
一个有错误的 C
源程序
bugging.c?
代码:?
-----------------?
1 #i
nclude?
2?
3 static
char buff [256];?
4 static
char* string;?
5 int
main ()?
6 {?
7 printf
("Please input a string: ");?
8 gets
(string); ?
9
printf
("\nYour string is: %s\n", string);?
10
}?
-----------------?
上面这个程序非常简单,其目的是接受用户的输入,然后将用户的输入打印出来。该程序使用了一个未经过初始化的字符串地址
string,因此,编译并运行之后,将出现
Segment
Fault 错误:?
$
gcc -o bugging -g bugging.c?
$
./bugging?
Please
input a string: asfd?
Segmentation
fault (core dumped)?
为了查找该程序中出现的问题,我们利用
gdb,并按如下的步骤进行:?
1.运行
gdb
bugging 命令,装入
bugging
可执行文件;?
2.执行装入的
bugging
命令
run;?
3.使用
where
命令查看程序出错的地方;?
4.利用
list
命令查看调用
gets
函数附近的代码;?
5.唯一能够导致
gets
函数出错的因素就是变量
string。用print命令查看
string
的值;?
6.在
gdb
中,我们可以直接修改变量的值,只要将
string
取一个合法的指针值就可以了,为此,我们在第8行处设置断点
break
8;?
7.程序重新运行到第
8行处停止,这时,我们可以用
set
variable 命令修改
string
的取值;?
8.然后继续运行,将看到正确的程序运行结果。
?
?
?有时会遇到一种很特殊的调试需求,对当前正在运行的其它进程进行调试(正是我今天遇到的情形)。这种情况有可能发生在那些无法直接在调试器中运行的进程身上,例如有的进程
只能在系统启动时运行。另外如果需要对进程产生的子进程进行调试的话,也只能采用这种方式。GDB可以对正在执行的程序进行调度,它允许开发人员中断程序
并查看其状态,之后还能让这个程序正常地继续执行。?
????
GDB提供了两种方式来调试正在运行的进程:一种是在GDB命令行上指定进程的PID,另一种是在GDB中使用“attach”命令。例如,开发人员可以先启动debugme程序,让其开始等待用户的输入。示例如下:?
#./debugme
Enter a string to count words:
????
接下去在另一个虚拟控制台中用下面的命令查出该进程对应的进程号:?
# ps -ax | grep debugme
555 pts/1 S 0:00 ./debugme
????
得到进程的PID后,就可以使用GDB对其进行调试了:?
# gdb debugme 555
GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)
Attaching to program: /home/xiaowp/debugme, process 555
Reading symbols from /lib/libc.so.6...done.
……
????
在上面的输出信息中,以Attaching
to
program开始的行表明GDB已经成功地附加在PID为555的进程上了。另外一种连接到其它进程的方法是先用file命令加载调试时所需的符号表,然后再通过“attaché”命令进行连接:?
(gdb) file /home/xiaowp/debugme
Reading symbols from /home/xiaowp/debugme...done.
(gdb) attach 555
……
????
如果想知道程序现在运行到了哪里,同样可以使用“backtrace”命令。当然也可以使用“step”命令对程序进行单步调试。?
????
在完成调试之后,不要忘记用detach命令断开连接,让被调试的进程可以继续正常运行。
?
转自:http://hi.baidu.com/brady_home/blog/item/6b92aa8ffdfee2e6f01f369b.html