gdb_C/C++_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > C/C++ > gdb

gdb

 2012/5/10 10:39:45  jiangwenfeng762  程序员俱乐部  我要评论(0)
  • 摘要:常用的gdb命令backtrace显示程序中的当前位置和表示如何到达当前位置的栈跟踪(同义词:where)breakpoint在程序中设置一个断点cd改变当前工作目录clear删除刚才停止处的断点commands命中断点时,列出将要执行的命令continue从断点开始继续执行delete删除一个断点或监测点;也可与其他命令一起使用display程序停止时显示变量和表达时down下移栈帧
  • 标签:

常用的gdb命令?

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已经成功地附加在PID555的进程上了。另外一种连接到其它进程的方法是先用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

  • 相关文章
发表评论
用户名: 匿名