GDB用法详解

上一篇 / 下一篇  2007-12-08 00:07:20 / 个人分类:软件开发

9_+RV@`!\T-}0使用GDB:
$p9H {&[7zh0   本文描述GDB,GNU的原代码调试器。(这是4.12版1994年一月,GDB版本4。16)
2bg.Mr!K0* 目录:51Testing软件测试网d [(|!xrW"u s M
* 摘要:                        GDB的摘要
*RE,h1Gh)b0* 实例:                          一个使用实例
[Pc:jtJjG0J0* 入门:                        进入和退出GDB
al!K)?q.y,n0* 命令:                        GDB 的命令
?{hb(N yj2q0* 运行:                        在GDB下运行程序
^H gk A?"D}0* 停止:                        暂停和继续执行51Testing软件测试网qz)aI+A'r]
* 栈:                          检查堆栈51Testing软件测试网/E9U0~P"uM!dr?)Y
* 原文件:                      检查原文件51Testing软件测试网rVk&d)tq
* 数据:                        检查数据
D?CL#D0* 语言:                        用不同的语言来使用GDB
,g)Lsw*~"F0* 符号:                         检查符号表
x] e.S(^0* 更改:                         更改执行51Testing软件测试网CS7pQ3kI&bZi
* GDB的文件                     文件51Testing软件测试网$C4x;G5O {'n mA
* 对象                          指定调试对象51Testing软件测试网7jexT7wkcK`(a1W(v(u
* 控制GDB                       控制
}#PWC1gZ0* 执行序列:                    执行一序列命令
#A+D5P.Ak,V5iF0* Emacs:                        使GDB和Emacs一起工作51Testing软件测试网dg5I/r-|eBP
* GDB的bug:51Testing软件测试网.r!eBY&e+Ep3M ? Q
* 命令行编辑:                  行编辑
1p&Nf7|mD1q9_Q0* 使用历史记录交互:51Testing软件测试网a S'sn$j
* 格式化文档:                  如何格式化和打印GDB文档51Testing软件测试网.C"[,GO!b9ah
* 安装GDB :51Testing软件测试网s8|)|&C)dEX \
 
IeV(T8E4\ UN7V0* 索引:
4T XU&k3L~0 51Testing软件测试网js0OR#XZ
GDB简介:
Q3T4N%I\0**************51Testing软件测试网C6pG0Fh+XYl
 
#a5@a0|o-nO0   调试器(比如象GDB)能让你观察另一个程序在执行时的内部活动,或程序出错时51Testing软件测试网k8w {X BI M @"Tc*b
发生了什么。
^*Q G4?@v0   GDB主要能为你做四件事(包括为了完成这些事而附加的功能),帮助你找出程序
_+_}#s9E0T0中的错误。
k*dsUG y y:J*Ea!e0   * 运行你的程序,设置所有的能影响程序运行的东西。51Testing软件测试网ffhk3Th oO
 51Testing软件测试网/pFw7p3d7GZ!C
   * 保证你的程序在指定的条件下停止。
`}8u_JH0 51Testing软件测试网a3o%O p&l @dF
   * 当你程序停止时,让你检查发生了什么。
WFJ_jE0 
:S&jrM1a9lzx0   * 改变你的程序。那样你可以试着修正某个bug引起的问题,然后继续查找另一51Testing软件测试网^L?a8h'\9V
     个bug.51Testing软件测试网!PB X{8d F
 
&~8sU~8oM5s2[u7B0   你可以用GDB来调试C和C++写的程序。(参考 *C 和C++)51Testing软件测试网"n2H F%ViH6eTT
 
xri-S%l@(v0   部分支持Modula-2和chill,但现在还没有这方面的文档。51Testing软件测试网9V6oz8LbJ)Y
 
7}Jk(m xV0qf0   调试Pascal程序时,有一些功能还不能使用。51Testing软件测试网]$Pf8FBX
 51Testing软件测试网#mZ%]#SXl)p
  GDB还可以用来调试FORTRAN程序,尽管现在还不支持表达式的输入,输出变量,
Lcs$OGa0或类FORTRAN的词法。
1_EM)S hagE,B(uesk0* GDB是"free software",大家都可以免费拷贝。也可以为GDB增加新的功能,不
9i(](x(z&[9_h3a)~^0过可要遵守GNU的许可协议幺。反正我认为GNU还是比较不错的:-)51Testing软件测试网{i?%o9v%gl
就这句话:
ag^7GY"Y0   Fundamentally, the General Public License is a license which says51Testing软件测试网.JX t8B'VqM
that you have these freedoms and that you cannot take these freedoms
U7YW.L1V-p0away from anyone else.51Testing软件测试网%c;p y l#Y2m n%M [#@^
GDB的作者:51Testing软件测试网+H9_L A;L?4@(a
   Richard Stallman是GDB的始作俑者,另外还有许多别的GNU的成员。许多人51Testing软件测试网2o:P'XvV8n&PC
为此作出了贡献。(都是老外不提也罢,但愿他们不要来找我麻烦:-))

|sdI"s0

r4S9e$P:\ JMQ0W0这里是GDB的一个例子:
5X!Mq4qZ$Cdlc'u0        原文中是使用一个叫m4的程序。但很遗憾我找不到这个程序的原代码,
EE'i&i~,n0所以没有办法来按照原文来说明。不过反正是个例子,我就拿一个操作系统51Testing软件测试网*ML&L*k'?/T,Z
进程调度原码来说明把,原代码我会附在后面。
5BO:W i?0        首先这个程序叫os.c是一个模拟进程调度的原程序(也许是个老古董了:-))。51Testing软件测试网avD+^ C*v'v
先说明一下如何取得包括原代码符号的可执行代码。大家有心的话可以去看一下gcc的51Testing软件测试网ki;?}(f8r{
man文件(在shell下打man gcc)。gcc -g <原文件.c> -o <要生成的文件名>
Q%pJ/Z ?#sJ;V0-g 的意思是生成带原代码调试符号的可执行文件。
G X!AN A F4f0-o 的意思是指定可执行文件名。
E?3A)M(c-A0(gcc 的命令行参数有一大堆,有兴趣可以自己去看看。)51Testing软件测试网:~l/G ~(S
反正在linux下把os.c用以上方法编译连接以后就产生了可供gdb使用的可执行文件。
CphA7d6Un K`E0我用gcc -g os.c -o os,产生的可执行文档叫os.
h]u'Y5t/vG0然后打gdb os,就可进入gdb,屏幕提示:51Testing软件测试网SHP({ W3U!_"x
     GDB is free software and you are welcome to distribute copies
qO:C2`:LR/G?a1kk0      of it under certain conditions; type "show copying" to see
9vIOR_ o2}}2v0      the conditions.
B$S:W&uLI D^4~0     There is absolutely no warranty for GDB; type "show warranty"51Testing软件测试网].q4RB1g$o t#k
      for details.
Mf:r$d*C8c-LO0 
_%A2Q[qzX0     GDB 4.16, Copyright 1995 Free Software Foundation, Inc...51Testing软件测试网w~&a/o'[
 (gdb)
*t7MJNaz:Yg+}-T0  (gdb)是提示符,在这提示符下可以输入命令,直到退出。(退出命令是q/Q)
5x/x7f B{X5_,NE0为了尽量和原文档说明的命令相符,即使在本例子中没用的命令我也将演示。
:X;]^1\c O_0首先我们可以设置gdb的屏幕大小。键入:51Testing软件测试网He'yep({Z {;HY
 (gdb)set width 7051Testing软件测试网O7lr4d$w
就是把标准屏幕设为70列。
3vB"k? ?J0  然后让我们来设置断点。设置方法很简单:break或简单打b后面加行号或函数名
W7\q"x/y.bA&wd0比如我们可以在main 函数上设断点:51Testing软件测试网T9H(l }OA L Jrnb$B
 (gdb)break main51Testing软件测试网&E v+y3DHO^$o
或(gdb)b main51Testing软件测试网?(K(G/n(F s7b
 系统提示:Breakpoint 1 at 0x8049552: file os.c, line 455.
v.[$BsKcX0 然后我们可以运行这个程序,当程序运行到main函数时程序就会停止返回到gdb的
$@Zn1\`$T.y1F.j0提示符下。运行的命令是run或r(gdb中有不少alias,可以看一下help,在gdb下打help)51Testing软件测试网 vD$uS:gNe
run 后面可以跟参数,就是为程序指定命令行参数。51Testing软件测试网f$w/DeW5fOB
比如r abcd,则程序就会abcd以作为参数。(这里要说明的是可以用set args来指定参51Testing软件测试网0C3Jy2t#r!V-X:i
数)。打入r或run后,程序就开始运行直到进入main的入口停止,显示:51Testing软件测试网(q]6T/{:B
Starting program: <路径>/os51Testing软件测试网/TO#Tp:T(NAO8h#qO.d|
 51Testing软件测试网zs,JxNOia
Breakpoint 1, main () at os.c:455
*yWjJ i7Ku#T'{hG J0455            Initial();51Testing软件测试网0SrA9{N
这里455 Initial();是将要执行的命令或函数。
r}QNA!P.uB0gdb提供两种方式:1.单步进入,step into就是跟踪到函数内啦。命令是step或s
3DIc)X _^5{ O.{g0                 2.单步,next,就是简单的单步,不会进入函数。命令是next或n51Testing软件测试网 |9dqd,[5]y,VG
这两个命令还有别的用法以后再说。
9Jod E Yz4o(u0我们用n命令,键入:
vF6HR0K(t-d1o j @0(gdb)n
UO6\Ai:]M,h0Success forking process# 1 ,pid is 31474
+M~!jB{7uY0 51Testing软件测试网3H2G&P"f)FVB\
Success forking process# 2 ,pid is 3147551Testing软件测试网Q:u!v!e[k3Kl
 
m3]w ACb*^~0Success forking process# 3 ,pid is 31476
x"ROv eX4R0 51Testing软件测试网 F%cnO5B:G O P
Success forking process# 4 ,pid is 3147751Testing软件测试网4L/O"Bi+U g'tJ-K
 
eF$ih3Lnu-K-UU0E0Success forking process# 5 ,pid is 31478
dG{ B$Xh5w#I%\ `0 51Testing软件测试网5yXew4ehS
Success forking process# 6 ,pid is 3147951Testing软件测试网XAsUQ5\&?mL*P+u
 51Testing软件测试网 Ul Ms }
                Dispatching Algorithm : FIFO
?)@!h:D-CZ:VNK0********************************************************************************51Testing软件测试网 zYV,n~0`$G9_)cw
 
h x#I_I\0            PCB#        PID     Priority        PC      State
%`5K+F;HQ%cR Q F0            1           31474      24            0      WAITING51Testing软件测试网,{8O a Ww2G
            2           31475      19            0      WAITING51Testing软件测试网Z+@q(|l3I
            3           31476      16            0      WAITING51Testing软件测试网 [J.T2w'r C+wRb
            4           31477      23            0      WAITING
JD Du]6N6@ ~X0            5           31478      22            0      WAITING51Testing软件测试网:i5Xf{ zr
            6           31479      20            0      WAITING51Testing软件测试网YNCk9C6H4@7b
 51Testing软件测试网yJ+F e\Yd
******************************************************************************51Testing软件测试网V4]"c]'}7y7E
 
}M(?ro&zb,G0CPU  :  NO process running
&kW5U;pL7n0Wa,aNo0IO :  No process51Testing软件测试网H'?2J8XO'sIS2V
Waiting CPU!!!  31474   31475   31476   31477   31478   31479
X&M@ Q)Wq1@p YY0Waiting  IO    NONE51Testing软件测试网@2CG)]HR
456            State=WAITING;51Testing软件测试网3Ca'qY k
最后的一行就是下一句要执行的命令。我们现在在另一个函数上加断点。注意我们
4t,i)N;Z&kG0可以用l/list命令来显示原代码。这里我们键入
Y8@V&l7~MnR)E0(gdb)l51Testing软件测试网3xrde&A U/p/g
451     main()
?Jm*q2e0452     {51Testing软件测试网(Zq,j*`%y*sj#C#m
453             int message;51Testing软件测试网 J$x L BO%R{2m0a
45451Testing软件测试网7S"PR5gl$t
455            Initial();51Testing软件测试网a`wXU`:f}
456            State=WAITING;
d/k F F]9Y_6Bg0457            printf("Use Control-C to halt \n");51Testing软件测试网"sI*ch)nD)j
458            signal(SIGALRM,AlarmMessage);51Testing软件测试网eV*O%U {)K
459            signal(SIGINT,InteruptMessage);51Testing软件测试网:},r!huu4zGW |o3o'V&g
460            signal(SIGUSR2,IoMessage);
t-N:cZe D0(gdb) l
,Laz4p0w7?L0461            alarm(TimeSlot);
p$e*SB|)e$x8WM2\5A0462            for(;;)
G4g _-T_0u M HIF0463             {51Testing软件测试网 dQ3TC%{ YD_lAI]
464             message=GetMessage();
X#v)YLak`3C+^0465                   switch(message)
Pce-E5b}2Dq0466                     {
)De+kp A$[^F0467                             case INTERRUPT :        printf("Use Control-C t;51Testing软件测试网.J`h#T+s
 51Testing软件测试网)YosN1X6|
468                                                     break;
PvMH7]0469                             case CHILD_IO:          WaitingIo();
5X*G'IJ QD,?8Wx0470                                                     break;
5X6z(v$pO(PB0显示了原代码,现在在AlarmMessage上加断点。51Testing软件测试网@7F*oH}Q.O
(gdb) b AlarmMessage
I7N)I A)I S.v0Breakpoint 2 at 0x8048ee3: file os.c, line 259.51Testing软件测试网n*cm9M"a7N(v3o
(gdb)
zz mqhG kQ0然后我们继续运行程序。51Testing软件测试网SE'S+{g|4bo:W
(gdb)c51Testing软件测试网S%`pR7z
c或continue命令让我们继续被中断的程序。 显示:
mlQ M8?O(o0Continuing.
n8J)K:VJ x3{9b1D0Use Control-C to halt51Testing软件测试网A,ar0U%E
 
[.x0uD7l{VXe }0Breakpoint 2, AlarmMessage () at os.c:259
PV+u1p&Zl0259             ClearSignal();
)x1}0z1j3K&_5f0注意我们下一句语句就是ClearSignal();
c+Y#i@5~1F @0我们用s/step跟踪进入这个函数看看它是干什么的。
/L9MBETI0(gdb) s51Testing软件测试网 Tj?}y6U9Y
ClearSignal () at os.c:22751Testing软件测试网4c@$n-J B0]({,dU
227             signal(SIGINT,SIG_IGN);51Testing软件测试网$q5H)p-gW ?t4l1ZvY
用l命令列出原代码:
$YvDcY$py;R J0q D/Q0(gdb) l51Testing软件测试网6m7Wh3krZ F&j_
222     }
%i2vA^^C!N$D022351Testing软件测试网Tt_b Yh+J;[
224
K+_f*FZ*jME `1C;_0225     void ClearSignal()    /* Clear other signals */
K#DwA~G,j0226     {
}2Ee?8PvF0227             signal(SIGINT,SIG_IGN);
4t vB W:HFjoC0228             signal(SIGALRM,SIG_IGN);
R J]*w@{?;u?{0229             signal(SIGUSR2,SIG_IGN);51Testing软件测试网.iy_*kL
230     }
*g4V0\;D{023151Testing软件测试网6}"~s0E I
(gdb)51Testing软件测试网\"^%GH#XR!rG
我们可以用s命令继续跟踪。现在让我们来试试bt或backtrace命令。这个命令可以
E6|7CE4RD;B0显示栈中的内容。
!j _cq7h\Y0(gdb) bt
-H1Y{;Ky&YDk7iU&{0#0  ClearSignal () at os.c:227
Ow,X)BqS0#1  0x8048ee8 in AlarmMessage () at os.c:259
9bxTk%]*M&ko;E0#2  0xbffffaec in ?? ()51Testing软件测试网'CN v6Zj[:v
#3  0x80486ae in ___crt_dummy__ ()51Testing软件测试网9uT\cY1n(z&h-?? f
(gdb)51Testing软件测试网)M \7SWr"H]
大家一定能看懂显示的意思。栈顶是AlarmMessage,接下来的函数没有名字--就是51Testing软件测试网;X\h%v-\*b
没有原代码符号。这显示了函数调用的嵌套。
'TO*q5w:z%\d!\0好了,我们跟踪了半天还没有检查过变量的值呢。检查表达式的值的命令是p或print
6or k-q+v7{P3f)a0格式是p <表达式>
,g OQu.e-c"Bl/OV0444444让我们来找一个变量来看看。:-)51Testing软件测试网4s DcQ)G@ ?-L*lLE[C
(gdb)l 151Testing软件测试网*Ma|6Kqt3t
还记得l的作用吗?l或list显示原代码符号,l或list加<行号>就显示从<行号>开始的51Testing软件测试网$@Z'`)V _NFW
原代码。好了找到一个让我们来看看WaitingQueue的内容
l5u5JC5Y;G6H0(gdb) p WaitingQueue51Testing软件测试网/j$^OJ!E+\
$1 = {1, 2, 3, 4, 5, 6, 0}51Testing软件测试网-UKs;F#PZr6h
(gdb)51Testing软件测试网nRVM;`$r[E
WaitingQueue是一个数组,gdb还支持结构的显示,51Testing软件测试网@[,}*a*Lf9t%Ayx
(gdb) p Pcb
ida'^ J F z)x8X z0$2 = {{Pid = 0, State = 0, Prior = 0, pc = 0}, {Pid = 31474, State = 2,51Testing软件测试网 BiE/xK
    Prior = 24, pc = 0}, {Pid = 31475, State = 2, Prior = 19, pc = 0}, {
r/Kfl)X&@'r6j0    Pid = 31476, State = 2, Prior = 16, pc = 0}, {Pid = 31477, State = 2,51Testing软件测试网-[B@)Qy
    Prior = 23, pc = 0}, {Pid = 31478, State = 2, Prior = 22, pc = 0}, {51Testing软件测试网,mDV Qf&p
    Pid = 31479, State = 2, Prior = 20, pc = 0}}51Testing软件测试网9fAbUnc
(gdb)51Testing软件测试网[i,nB6[ m
这里可以对照原程序看看。
8B/US7@ ` mos F1m.~0原文档里是一个调试过程,不过我想这里我已经把gdb的常用功能介绍了一遍,基本上
O]C4W|4^l0可以用来调试程序了。:-)

9D rNZY+Wj7@V051Testing软件测试网"y @H t^1N-NS


7a7Q"L)G?*G-lr.dcg0运行GDB(一些详细的说明):51Testing软件测试网 {y} I W
 
2e3n-iBabhYd'~0  前面已经提到过如何运行GDB了,现在让我们来看一些更有趣的东西。你可以在运行51Testing软件测试网|W!u'tihL$u+{9{
GDB时通过许多命令行参数指定大量的参数和选项,通过这个你可以在一开始就设置好
*],sM @ X0程序运行的环境。
cXe\/A8\ `I0  这里将要描述的命令行参数覆盖了大多数的情况,事实上在一定环境下有的并没有51Testing软件测试网"lE5{V"r @TU
什么大用处。最通常的命令就是使用一个参数:
G/p%X3K E4X$?@R0 $gdb <可执行文档名>51Testing软件测试网 h}*A4r[/s/V
你还可以同时为你的执行文件指定一个core文件:51Testing软件测试网:F/`._tB7BD
 $gdb <可执行文件名> core
I%B q?~A0你也可以为你要执行的文件指定一个进程号:51Testing软件测试网5Dh p,[.H/Uu
 $gdb <可执行文件名> <进程号> 如:&gdb os 1234将使gdb与进程1234相联系(attach)51Testing软件测试网G%RVm @ ny:G v-]
除非你还有一个文件叫1234的。gdb首先检查一个core文件。51Testing软件测试网+E6Exp ?8q
如果你是使用一个远程终端进行远程调试的话,那如果你的终端不支持的话,你将无法
5eM!~M9Wt0使用第二个参数甚至没有core dump。如果你觉得开头的提示信息比较碍眼的话,你可以51Testing软件测试网!o3GG iZ8_+H
用gdb -silent。你还可以用命令行参数更加详细的控制GDB的行为。51Testing软件测试网c\:rk%T
打入gdb -help或-h 可以得到这方面的提示。所有的参数都被按照排列的顺序传给gdb51Testing软件测试网 \ PA0\~O ] U;a)o#c
除非你用了-x参数。51Testing软件测试网Y)}Cn&v `*Q
  当gdb开始运行时,它把任何一个不带选项前缀的参数都当作为一个可执行文件或core
0i%f7p5V f"J:Wq0文件(或进程号)。就象在前面加了-se或-c选项。gdb把第一个前面没有选项说明的参数51Testing软件测试网9z w"kn-G
看作前面加了-se 选项,而第二个(如果有的话)看作是跟着-c选项后面的。51Testing软件测试网+WhU3{0q
  许多选项有缩写,用gdb -h可以看到。在gdb中你也可以任意的把选项名掐头去尾,只
&U a2Ko0v4Ht"D0要保证gdb能判断唯一的一个参数就行。51Testing软件测试网;j!SVeD!Q O6A
在这里我们说明一些最常用的参数选项
xE"[Go3F[ p-F0-symbols <文件名>(-s <文件名>)------从<文件名>中读去符号。
ax&S)k!w"^5O0-exec <文件名>(-e <文件名>)----在合适的时候执行<文件名>来做用正确的数据与core51Testing软件测试网F,IZ:e$HAW2j
 dump的作比较。
9G7`j#dg)h+B ~0-se <文件名>------从<文件名>中读取符号并把它作为可执行文件。
c)|o$nB|0-core <文件名>(-c <文件名>)--指定<文件名>为一个core dump 文件。
$Q*B7|:n,J0-c <数字>----连接到进程号为<数字>,与attach命令相似。51Testing软件测试网T,bkWZ_!__G
-command <文件名>51Testing软件测试网$D(kcX+L'{L
-x <文件名>-----执行gdb命令,在<文件名>指定的文件中存放着一序列的gdb命令,就51Testing软件测试网 jI8dkV
象一个批处理。
(}.\]&A{*} k*_0-directory(-d) <路径>---指定路径。把<路径>加入到搜索原文件的路径中。51Testing软件测试网-dCKR1s)T;|F
-m51Testing软件测试网x!\ l!_f1x2K
-mapped----
9k i0ZJ|A0   注意这个命令不是在所有的系统上都能用。如果你可以通过mmap系统调用来获得内存51Testing软件测试网 R#? TbYq7X7g
映象文件,你可以用这个命令来使gdb把你当前文件里的符号写入一个文件中,这个文件51Testing软件测试网$r(O}@*pWG(U
将存放在你的当前路径中。如果你调试的程序叫/temp/fred那么map文件就叫
R0H W y2}S`^4qG}0./fred.syms这样当你以后再调试这个程序时,gdb会认识到这个文件的存在,从而从这51Testing软件测试网5E*Gv/r1A'cnGRm
个文件中读取符号,而不是从可执行文件中读取。.syms与主机有关不能共享。
1rmYBN6Z z0-r
i&U[^Rfty]{0-readnow---马上从符号文件中读取整个符号表,而不是使用缺省的。缺省的符号表是
tI.Wt0~U g0调入一部分符号,当需要时再读入一部分。这会使开始进入gdb慢一些,但可以加快以后
/I-b7fNA0F i9Y;\y+K0的调试速度。
|"L O;a F"D(Up0 
ZSC4vE-j1?U q`!\0 -m和-r一般在一起使用来建立.syms文件
4n f$j6zY|:@*{!z F0 
jy|U%KI/f0 51Testing软件测试网a.H8O W,jB0?BZ
接下来再谈谈模式的设置(请听下回分解 :-))
-uS*h+D2Dc-J8zL0附:在gdb文档里使用的调试例子我找到了在minix下有这个程序,叫m4有兴趣的
ovFf2]yI,`V0可以自己去看看

CGC-m)]v ss0

:g-CE)`F1RP051Testing软件测试网&FkN bZ"]J
模式的选择51Testing软件测试网/L(rAET6sh+\%A
--------------
xb9g2t q~i0现在我们来聊聊gdb运行模式的选择。我们可以用许多模式来运行gdb,例如在“批模式”51Testing软件测试网o2UEN$}lA;R
或“安静模式”。这些模式都是在gdb运行时在命令行作为选项指定的。51Testing软件测试网#il N W4w$r {
`-nx'51Testing软件测试网0]p8Z7xy
`-n'51Testing软件测试网j U&B7kMin&R
     不执行任何初始化文件中的命令。(一般初始化文件叫做`.gdbinit').一般情况下在
*L_)d)oIY7I j3f%{0这些文件中的命令会在所有的命令行参数都被传给gdb后执行。
g!Ds)PHe3W?K0 51Testing软件测试网 Vu^#m6LKJ/f
`-quiet'51Testing软件测试网b0mR i U;W
`-q'
;L3F:}'sQC0     “安静模式”。不输出介绍和版权信息。这些信息在“批模式”中也被跳过。
$J!f1g/lD ]/j Z(kC"V0 
ik!WD0rq2H\&M0`-batch'
/LHz-vz(k0     “批模式”。在“批模式”下运行。当在命令文件中的所有命令都被成功的执行后
)S!Kv)|&z{ |'T0     gdb返回状态“0”,如果在执行过程中出错,gdb返回一个非零值。
nfi1`*tK0     “批模式”在把gdb作为一个过滤器运行时很有用。比如在一台远程计算机上下载51Testing软件测试网6`zU5j} mBx
     执行一个程序。信息“ Program exited normally”(一般是当运行的程序正常结束
Lo"H#^P(D0     时出现)不会在这种模式中出现。51Testing软件测试网9\+_Li:u.U?jj#n
`-cd DIRECTORY'51Testing软件测试网+x F s+M!G1zy
     把DIRECTORY作为gdb的工作目录,而非当前目录(一般gdb缺省把当前目录作为工作目51Testing软件测试网 @d$ZhfT&p0DPLm
     录)。51Testing软件测试网!}7D G&QMWi'[-w"w
`-fullname'51Testing软件测试网 iTWC"nR6w
`-f'
*kH;Tw5I8~*_0     GNU Emacs 设置这个选项,当我们在Emacs下,把gdb作为它的一个子进程来运行时,51Testing软件测试网 nqb,w&\-e
     Emacs告诉gdb按标准输出完整的文件名和行号,一个可视的栈内容。这个格式跟在
y L1}I7Z,E)T g0     文件名的后面。行号和字符重新按列排,Emacs-to-GDB界面使用\032字符作为一个
.r.qP4K)qn0     显示一页原文件的信号。
5ga"n F7y8Ttd$h:sc0`-b BPS'
l+UXFH8RV0v0     为远程调试设置波特率。
;gW PeSk%?0 
!O tN_I-I*m)P|'c0`-tty DEVICE'
._)Z1s#j'U5\:L(~%d0     使用DEVICE来作为你程序的标准输入输出。

?0Pg?*aes0

9O4}0tj^~P/y0 

x!@#WSP0

6x8^-I:at!C0退出gdb
L8Lf D9Ar0============51Testing软件测试网&h H_$Td6FF
 
Q|0hS4pya0`quit'51Testing软件测试网ZWa5@7_qH:a
     使用'quit'命令来退出gdb,或打一个文件结束符(通常是' CTROL-D')。如果
q.g D&i7M9C]7h0     你没有使用表达式,gdb会正常退出,否则它会把表达式的至作为error code51Testing软件测试网 A7\7vZc,[6Q
     返回。51Testing软件测试网'Vny!u$]6U Z!_;zT T
 51Testing软件测试网IC,E2u+Cq![
     一个中断(通常是'CTROL-c)不会导致从gdb中退出,而是结束任何一个gdb的命
@A+R6Tv7y2K0     令,返回gdb的命令输入模式。一般在任何时候使用'CTROL-C'是安全的,因为
7?0k3oJ GA;OA0     gdb会截获它,只有当安全时,中断才会起作用。
~~-m:|q2k0     如果你正在用gdb控制一个被连接的进程或设备,你可以用'detach'命令来释放51Testing软件测试网zN7H7S6U Y
     它。
(q9_a%? sW#B0 
7Q7BZ8OT%|}0Shell命令51Testing软件测试网I4i'O.A]CX(p
==============
7e d+Q~xle0    当你偶尔要运行一些shell命令时,你不必退出调试过程,也不需要挂起它;你51Testing软件测试网4W*~DR.e3UDv ^
    可以使用'shell'命令。51Testing软件测试网iK6^VR [,H/H
 51Testing软件测试网/rwX1J+`-RTA
`shell COMMAND STRING'
$O}| zC _7j0     调用标准shell来执行'COMMAND STRING'.环境变量'SHELL'决定了那个shell被51Testing软件测试网&@^6O&x$CMa
     运行。否则gdb使用'/bin/sh'.51Testing软件测试网!]'qg Uq7p3k A0\
     'make'工具经常在开发环境中使用,所以你可以不用'shell'命令而直接打'make'51Testing软件测试网+n%V4R+z0zAiM
 51Testing软件测试网c5} Y w)O2QWp
`make MAKE-ARGS'
9N-z2qXi/kM0     用指定的命令行变量来运行'make'程序,这等于使用'shell make MAKE-ARGS'51Testing软件测试网 yRX+qu/\7XmD
GDB 命令51Testing软件测试网ee)pnt nl
************
&?+a#Ik8JS&]0   我们可以把一个gdb命令缩写成开头几个字母,如果这没有二意性你可以直接回车来
W{/d W J0   运行。你还可以使用TAB键让gdb给你完成接下来的键入,或向你显示可选择的命令,
H@!z`^~}du0   如果有不止一个选择的话。51Testing软件测试网N^8u W9zt~C
 51Testing软件测试网&e p?c"r8A7Y+i&W
Command语法
M3Yh*l%s$P`p W0==============51Testing软件测试网@O+n ^2f.D-w N/Sa
 
~AC(diW-y"}O0   一个gdb命令是一个单行的输入。长度没有限制。它一个命令开头,后面可以跟参量。
M|.I1dN?6vI0   比如命令'step'接受一个参量表示单步执行多少步。你也可以不用参量。有的命令51Testing软件测试网g(M y:E { tH
   不接受任何参量。
2QryAPxQ0 51Testing软件测试网'p.v#aS6^#qJ
   gdb命令只要没有二意性的话就可以被缩写。另外一些缩写作为一个命令列出。在某些51Testing软件测试网4hH4yt S1K8Eu
   情况下二意也是允许的。比如's'是指定'step'的缩写,但还有命令'start'。你可以把51Testing软件测试网I:p/Qol
   这些缩写作为'help'命令的参量来测试它们。
7uM~\"v%e7e#EV^0   空行(直接回车)表示重复上一个命令。但有些命令不能重复比如象'run',就不会以这51Testing软件测试网J F{F*G&@'R^8qN9\'r w
   种方式重复,另外一些当不小心重复会产生严重后果的命令也不能用这种方法重复。51Testing软件测试网 y%vF0Sy(CCxB
   'list'和'x'命令当你简单的打回车时,会建立新的变量,而不是简单的重复上一个命
7FP`{a i y%P/I],h0   令。这样你可以方便的浏览原代码和内存。
0op? I$B c,uX0   gdb还有一种解释RET的方法:分割长输出。这种方法就和'more'命令相似。由于这时经51Testing软件测试网 Iwx+qj)O
   常会不小心多打回车,gdb将禁止重复当一个命令产生很长的输出时。51Testing软件测试网G^?} [ dhL R
   任何用'#'开头一直到行尾的命令行被看作是注释。主要在命令文件中使用。51Testing软件测试网} R3Sx.wJ
 51Testing软件测试网}-nxc-RZ

6?A%T$@1R0 51Testing软件测试网*Y@lD4U@

51Testing软件测试网$]'Un;i]`

输入命令的技巧51Testing软件测试网.ne/cg:U#o s4T5l
==================
:}'}5l4q2xqhcn0   前面已经提到过TAB键的使用。使用TAB键能让你方便的得到所要的命令。比如51Testing软件测试网.[T_ZR/z{.d}*?l
在gdb中:51Testing软件测试网5Z)K?Ui
   (gdb)info bre <TAB>(键入info bre,后按TAB键)51Testing软件测试网r _9OD#rQ\2f
   gdb能为你完成剩下的输入。它还能萎蔫提供选择的可能性。如果有两个以上可51Testing软件测试网:i d|(FO3T
能的话,第一次按<TAB>键,gdb会响铃提示,第二次则显示可能的选择。同样gdb
.D!jK!a0J0也可以为一些子命令提供快速的访问。用法与上相同。
F9`7iZZuz m0  上例中显示51Testing软件测试网 F8B4U,k v Q&w'{J
   (gdb)info breakepoints51Testing软件测试网/x8gL9O)L$s1MF9W
   你也可以直接打回车,gdb就将你输入的作为命令的可能的缩写。来判断执行。51Testing软件测试网'Gu*u+Jt
如果你打入的缩写不足以判断,那么gdb会显示一个列表,列出可能的命令。同样的51Testing软件测试网,w$kKiU:Ul
情况对于命令的参数。在显示完后gdb把你的输入拷贝到当前行以便让你继续输入。
R%KF,lo&?N)C]0   如果你只想看看命令的列表或选项,你可以在命令行下打M-?(就是按着ESC键
okpT%Z{q*zp%A t0同时按SHIFT和?键)。你可以直接在命令行下打试试。
]$q [w[0  (gdb)<M-?>51Testing软件测试网!WhE$XU ??
   gdb会响铃并显示所有的命令。不过这种方式好象在远程调试是不行。当有的命令
-D"^rTzD0使用一个字符串时,你可以用" ' "将其括起来。这种方法在调试C++程序时特别有用。
4rt^};F+r{+p0因为C++支持函数的重载。当你要在某个有重载函数上设断点时,不得不给出函数参数
2L\a#u!S-G g"|?0以区分不同的重载函数。这时你就应该把整个函数用" ' "括起来。比如,你要在一个
HoDL4g:h0叫name的函数上设断点,而这个函数被重载了(name(int)和name(float))。你将不得
8{TnKV z_"s0不给出参变量以区分不同的函数。使用'name(int)'和'name(float)'。这里有个技巧,51Testing软件测试网}2W[z"jv7|0y#v
你可以在函数名前加一个" ' "符号。然后打M-?.51Testing软件测试网{LzRPT)b4Z]
 51Testing软件测试网:`:KB%RV$sg@

k2v`.la#?:\0 51Testing软件测试网 }/rG2n"avw'r:Z [

8~%~7F@:b0东西太多了,翻起来好费时间,只好慢慢的贴了。//shy
Q3o5y_0x0h4v+t)Kz5S0如果有人愿意一起做这件事的话请回信到我信箱。
Y4|/cwN&U3o&Y0 51Testing软件测试网/y\ rB7mz}p jC
得到帮助
i1qlqlU!ao0============51Testing软件测试网||Xy/z(j*S OPb
   你可以使用help命令来得到gdb的在线帮助。
/g [j;f ?0 
xiEh,Q0`help'
+Lf9h/_"k}T/L \0`h'
clLg6_?@)N0      你可以使用help或h后面不加任何参数来得到一个gdb命令类的列表。51Testing软件测试网d:p@w$b6x
 
Y5qul-|0          (gdb) help
8g(c is%sG`ni_}0          List of classes of commands:51Testing软件测试网 OX9k4r#~EB
 
"q.Hw$A-J9`-N0          running -- Running the program
B)Fc!\rO9_ K]0          stack -- Examining the stack
FT6m3s9xu0          data -- Examining data51Testing软件测试网B{@1n[
          breakpoints -- Making program stop at certain points51Testing软件测试网\5aT0H u0@1h]$P3`
          files -- Specifying and examining files51Testing软件测试网?@+^)q;zX,z
          status -- Status inquiries
zue]tE+A8l_0          support -- Support facilities
w\D$^5h0          user-defined -- User-defined commands51Testing软件测试网c ?c3Nn
          aliases -- Aliases of other commands51Testing软件测试网"~mEV6E_8^
          obscure -- Obscure features
]p.Kt s0 51Testing软件测试网2Bs g-w}4]S~ @G
          Type "help" followed by a class name for a list of51Testing软件测试网*hp lQ_
          commands in that class.
0xV1W.F"T;m+h^_ e0          Type "help" followed by command name for full51Testing软件测试网3gX(}u c0Ns t&cd
          documentation.
Vv$] CZ \bB'T0          Command name abbreviations are allowed if unambiguous.
lX!xX8wf6?&\0          (gdb)
![5L@yBJ0 
o.^QuI!{i(I0`help CLASS'51Testing软件测试网ROM hr@#O
     使用上面列出的help class作为help或h的参量,你可以得到单一的命令列表。51Testing软件测试网+S ~K@3O
     例如显示一个'status'类的列表。51Testing软件测试网ePOV\N:INL}
 
!H8Mi-jsR fYm4t0          (gdb) help status51Testing软件测试网:cZ} D'g
          Status inquiries.
W,Q+iHu D U1]0 51Testing软件测试网 ZvJ4}l
          List of commands:
r v"O{j.e"B3s0 51Testing软件测试网5e{w/m:C
          show -- Generic command for showing things set
g Sn)a1A0?i:ea-YT0           with "set"51Testing软件测试网U9BD.fE
          info -- Generic command for printing status51Testing软件测试网B"rI8uvo!m
 51Testing软件测试网9sL A~/K]
          Type "help" followed by command name for full51Testing软件测试网*hu"o6l}-a
          documentation.
(O2} n9Jb0w!J v Qb%E0          Command name abbreviations are allowed if unambiguous.
3j} eg kK0          (gdb)51Testing软件测试网lG+}1z~0S0k
 51Testing软件测试网rq#wtOk6U]@Wwz
`help COMMAND'
ppun.T-I)j8Gs!L0     详细列出单个命令的资料。
k,AM Jk-He5NV]0 51Testing软件测试网qd1D5Xio k\
`complete ARGS'51Testing软件测试网JS S/S+|:}jp p
     列出所有以ARGS开头的命令。例如:51Testing软件测试网z!~kSG$y.i
 51Testing软件测试网5B6B_Q!k"^
          complete i51Testing软件测试网7Bh$F0L9IfS5a8L
 51Testing软件测试网3z7gL _%p.QJ
     results in:
#Hp'`$X ^[n0 
%a.{%msiv M;D0          info51Testing软件测试网-t` Ph+[u
          inspect
#gtQ+H;a!e,Y0          ignore51Testing软件测试网,I/O.Kn*m|
 51Testing软件测试网c8p0k*gA,a M |tW
     This is intended for use by GNU Emacs.51Testing软件测试网*b u(\/dD-u
 
9d,im M$ar0   除了使用'help'你还可以使用gdb的命令'info'和'show'来查询你程序的51Testing软件测试网9T&r*be |4X4o$B:U
状态,每个命令可以查询一系列的状态。这些命令以恰当的方式显示所有的
o5Ksp DnE^)Q$X0子命令。
%bu S#io7[l,HX s0 
3d HJ(d] W$P [)R0`info'51Testing软件测试网J3Bw;QY
     此命令(可以缩写为'i')用来显示你程序的状态。比如,你可以使用info
O hU+nAd"A$p `3r0args 列出你程序所接受的命令行参数。使用info registers列出寄存器的状态。51Testing软件测试网FYj,EpJK B\
或用info breakpoint列出在程序中设的断点。要获得详细的关于info的信息打51Testing软件测试网:eHfe!I y@
help info.51Testing软件测试网1]5i3Yb2@ E
`set'
s U+r"o C@-i"@B%|^0     这个命令用来为你的程序设置一个运行环境(使用一个表达式)。比如你
`%Ng$dY/I!Z!j!E0可以用set prompt $来把gdb的提示符设为$.
ZL$gi8[0 51Testing软件测试网ND6OL9r.g:v
`show'51Testing软件测试网9~S({L `
     与'info'相反,'show'命令用来显示gdb自身的状态。你使用'set'命令来51Testing软件测试网H%d-[ C2QW B
可以改变绝大多数由'show'显示的信息。比如使用show radix命令来显示基数。
h"J1h as7o0用不带任何参变量的'set'命令你可以显示所有你可以设置的变量的值。
#SB!{+wb0有三个变量是不可以用'set'命令来设置的。
(M5s_!uc^0`show version'
sZ$}N"c{j0     显示gdb的版本号。如果你发现gdb有bug的话你应该在bug-reports里加51Testing软件测试网1y~+Ii3KRS{
入gdb的版本号。
c,z+@$Q w0 51Testing软件测试网d5{\ ^Q \l c [
`show copying'
,p_5\1?@u0显示版权信息。51Testing软件测试网uKNF3n
 
T GL[;Q/`0`show warranty'
w!E#F#|A0显示担保信息。
td.Z c){Hf'd0在gdb下运行你的程序51Testing软件测试网}1Fj.?2b-gL/G
**************************
g2U2|x~ Y2MF0   当你在gdb下运行程序时,你必须先为gdb准备好带有调试信息的可执行文档。
&aF'E&]z0还可以在gdb中为你的程序设置参变量,重定向你程序的输入/输出,设置环境变
#B#l){} Q"u7V.u0量,调试一个已经执行的程序或kill掉一个子进程。51Testing软件测试网&Z Qu0N9X+^5p4jvl
   这里许多内容在早先的例子中都已经用到过,可以参见gdb(二)。51Testing软件测试网x^ ?%s9H
目录:51Testing软件测试网#N)i|a7\,] N1z[ I
 
$g)G0~0p,L#T0* 编译::                        为调试编译带调试信息的代码51Testing软件测试网e7r%OMw E!c)\
* 运行::                        运行你的程序51Testing软件测试网6c_`X [
* 参变量::                      为你的程序设置参变量51Testing软件测试网PF k8G bt
* 运行环境::                    为你的程序设置运行时环境
'iQ4M*]OQ#Zl#r}0* 设置工作目录::                在gdb中设置程序的工作目录。
LW'B,y%HC _8F}b,e0* 输入/输出::                   设定你程序的输入和输出
c(YUEaa0* 连接::                        调试一个已经运行的程序
XDCq+[W(e0* 结束子进程::                  Kill子进程
'L I*xr;s4De1F0* 进程信息::                    附加的进程信息
8a ZX)Fd'Z0* 线程::                        调试带多线程的程序51Testing软件测试网aX`Q B7XF-l
* 多进程::                   调试带多进程的程序51Testing软件测试网0I0M|4B_'OC ? Km/pC
为调试准备带调试信息的代码
*q N~S&M9P;P0===========================
|'kK sX0   为了高效的调试一个程序,你需要使用编译器来产生附带调试信息的可执行代码
{t'Z+uS0这些调试信息存储在目标文件中;描述了变量数据类型和函数声明,在原文件代码行51Testing软件测试网/y9K\ h!RL raeU
和执行代码之间建立联系。
b{:Q0V%_$c#nb0   为产生调试信息,当你使用编译器时指定'-g'选项,就可以为你的程序产生带有51Testing软件测试网A9i$hd+_b3S
调试信息的可执行代码。51Testing软件测试网wfO:M}&@0b
   有些c编译器不支持'-g'选项和'-O'选项,那你就有麻烦了,或者有别的方法产生51Testing软件测试网1_aE#K)@"B1?_7L
带调试信息的可执行代码,要不就没办法了。51Testing软件测试网:l5F*|:ui\cG
   gcc,GNU的c语言编译器支持'-g'和'-O'选项。这样你就可以产生带调试信息的且51Testing软件测试网X|"|5uw#_M
优化过的可执行代码.51Testing软件测试网2{-T5ep6Ipp|
   当你使用gdb来调试一个使用'-g','-O'选项产生的程序时,千万记住编译器为了优
4Mt*GAPBvj0化你的程序重新安排了你的程序。不要为运行次序与你原来设想的不同,最简单的例子51Testing软件测试网Q/b8?%Ok)C;A.K R*@
就是当你定义了一个变量但从未使用过它时,gdb中是看不到这个变量的--因为它已经51Testing软件测试网awP k8M
被优化掉了。
%_Y4pw B.i}jY+i0   所以有时你不要使用'-O'选项,如果当你不用优化时产生的程序是正确的,而优化
,s7| \Sk,E0过后变的不正确了,那么这是编译器的bug你可以向开发者提供bug-reports(包括出错
n&K`VW#K1[#X9I0的例子)。
z7S5Ct p0   早期的GUN C语言编译器允许'-gg'选项,也用来产生调试信息,gdb不再支持这种格51Testing软件测试网.` N#i7`4gk J
式的调试信息,如果你的编译器支持'-gg'选项,请不要使用它。51Testing软件测试网fzU Po
 

:u o)F{Pb0

^U UX Ck7]0q)Tw0 51Testing软件测试网GUVXMN Fo3Y

51Testing软件测试网2T5~m/L1WY]|W9t!c


'aq#In Nai h0开运行你的程序51Testing软件测试网 m'jx%Q?Qi\
=====================51Testing软件测试网G`G/Cv Gg@
 
.^6^HlaE'WX0}4K `:N0`run'
;HU-U9V+m{0`r'51Testing软件测试网7~[ U yX+J9DrX
     使用'run'命令在gdb下启动你的程序。你必须先指定你程序的名字(用gdb的命令行51Testing软件测试网Dv/b#t+I%w;l}o
参数)或使用'file'命令,来指定文件名。如果你在一个支持多进程的环境下运行你的程51Testing软件测试网-N?}A7^D7w Lx
序'run'命令创建一个子进程然后加载你的程序。如果环境不支持进程,则gdb直接调到
,B3D2l-DZ;]K0程序的第一条命令。
'Ug3}!y!H q0   一些父进程设置的参量可以决定程序的运行。gdb提供了指定参量的途径,但你必须51Testing软件测试网6W1kz6K4PL^-z)l
在程序执行前设置好他们。你也可以在运行过程中改变它们,但每次改变只有在下一次51Testing软件测试网a-P^$p4?F?,M
运行中才会体现出来。这些参量可以分为四类:
F2ty'ZSJ0---参数51Testing软件测试网3}-a+Bz7Z(b_s@4_
     你可以在使用'run'命令时设置,如果shell支持的话,你还可以使用通配符,或
6Do.z {&f0A HR0变量代换。在UNIX系统中你可以使用'shell环境变量'来控制shell。
"a)\rI]V.roa t^0---环境:
&Q)m O,f2dJ*K0M^0     你的程序一般直接从gdb那里继承环境变量。但是你可以使用'set environment'
!@ y R `.At0命令来设置专门的环境变量。
6EG FF#g/[Q#WBB!L0---工作目录51Testing软件测试网G5]s])v/R
     你的程序还同时从gdb那里继承了工作目录,你可以使用'cd'命令在gdb中改变工作51Testing软件测试网r!vn(w5p+Fu
目录。51Testing软件测试网\f7@$]O
---标准输入/输出
aY5q8vAL0     你的程序一般使用与gdb所用的相似的设备来输入/输出。不过你可以为你的程序的
#oh:|5sqglYuR}0输入/输出进行重定向。使用'run'或'tty'命令来设置于gdb所用不同的设备。
E~(vnz0*注意:当你使用输入/输出重定向时,你将不能使用无名管道来把你所调试的程序的输出
#M*qK0V#X+C0传给另一个程序。这样gdb会认为调试程序出错。51Testing软件测试网&rs?8fa}I @b-Z
   当你发出'run'命令后,你的程序就开始运行。51Testing软件测试网t'G'y3T%C/Pz9f
   如果你的符号文件的时间与gdb上一次读入的不同,gdb会废弃原来的符号表并重新读51Testing软件测试网T6D1i|zC
入。当前的断点不变。51Testing软件测试网8H:[BR N
 51Testing软件测试网6`DC4Edj

51Testing软件测试网 Ko!b#P:G$I5Jak

 

SJx\9E z%j1r0

`g&\+S7V#tM2h0程序环境51Testing软件测试网G8\FZS(]"e T D
==========================51Testing软件测试网-D;^`3jS#nQ&VG'D
   “环境”包括了一系列的环境变量和它们的值。环境变量一般记录了一些常用的信息,51Testing软件测试网/cAGj]M
比如你的用户名,主目录,你的终端型号和你的运行程序的搜索路径。一般你可以在shell
X-A@-y/nlP0下设置环境变量,然后这些变量被所有你所运行的程序所共享。在调试中,可以设置恰当51Testing软件测试网*~|.DK5D4F
的环境变量而不用退出gdb.51Testing软件测试网n a9o R9S6Bg
 51Testing软件测试网|`mB @E1n7R
`path DIRECTORY'51Testing软件测试网j}9p9~ S.f o$_.IN!{$N6D
     在'PATH'环境变量前加入新的内容('PATH'提供了搜索执行文件的路径)。对于gdb和
$c+V(p$MN TYv%|0你的程序来说你也许要设置一些专门的路径。使用':'或空格来分隔。如果DIRECTORY已经51Testing软件测试网#GGi8`C#Z,v1d#}LO
在路径中了,这个操作将会把它移到前面。
|-S{9x2F l:e]F'b0     你可以使用串'$cmd'来代表当前路径,如果你用'.'的话,它代表你使用'path'命令
J J(l,\0Z8t6Em0时的路径,gdb将在把DIRECTORY加入搜索路径前用'.'代替当前路径51Testing软件测试网&?zQ&p-f5WO&K;r
 51Testing软件测试网1J&RiPs5q%z p
`show paths'
.O;B7hGS?8FH0     显示当前路径变量的设置情况。51Testing软件测试网"a P1p0? ap8{|
 51Testing软件测试网]Ph,z$Ts)?
`show environment [VARNAME]'51Testing软件测试网$TZ9g$F.\ H1BG @
     显示某个环境变量的值。如果你不指明变量名,则gdb会显示所有的变量名和它们的
%n(s{L'`S0内容。environment可以被缩写成'env'
r5nBd-`#]8qA0 51Testing软件测试网L)zR S fy#I|-[
`set environment VARNAME [=] VALUE'51Testing软件测试网W XX9BxSk*qf6Q
     设置某个环境变量的值。不过只对你所调试的程序有效。对gdb本身是不起作用的。51Testing软件测试网1U2pg8Z6Q1NYZ DS!L
值可以是任何串。如果未指定值,则该变量值将被设为NULL.
6T7@;G*l:cy'Y|0看一个例子:51Testing软件测试网K&G8{X ~ J)l.J
          set env USER = foo
.lU;q U8_M"H)er0     告诉一个linux程序,当它下一次运行是用户名将是'foo'51Testing软件测试网'KpBZ NT:vco&x(E?]
 51Testing软件测试网I#}*L,o7U
`unset environment VARNAME'
}tA_ h\__0     删除某环境变量。
tT jj6z g5g1|]0 
vU[F;C^6E cI0   注意:gdb使用'shell'环境变量所指定的shell来运行你的程序。
qm:GsiECC(~0 

%M-g\r LW-Z051Testing软件测试网}1T%rrYlb%`

 

W;f O RF/LK W,vt(Q/{0

w%w*riq-j0工作路径
U H6bNWI0================================51Testing软件测试网_ cGC hys2p g/j.L
   当你每次用'run'命令来运行你的程序时,你的程序将继承gdb的51Testing软件测试网2g j;b+fEx3]:G1[f,y
当前工作目录。而gdb的工作目录是从它的父进程继承而来的(一般是
EB6J.Ip$b0shell)。但你可以自己使用'cd'命令指定工作目录。51Testing软件测试网E HiI3EXaK#G`}%J
   gdb的工作目录就是它去寻找某些文件或信息的途径。
n2kE8l9k0`cd DIRECTORY'
WS3L u(mqwD0     把gdb的工作目录设为DIRECTORY
E2T]i$~9Wc!n#U eH)\0`pwd'
I7p'r9z[c2p%Y+l BY0     打印输出当前目录。51Testing软件测试网U AO A{;y$j I
你程序的输入/输出51Testing软件测试网~pmq3Vf4t
===============================
*Y'V8r0R)l9Qcs0   缺省时,你的程序的输入/输出和gdb的输入/输出使用同一个终端。
(]?f6?(Iwp]Y0gdb在它自己和你的程序之间切换来和你交互,但这会引起混乱。51Testing软件测试网2E1K#k0v)Il TznBf
`info terminal'
|z5{|w0     显示你当前所使用的终端的类型信息。
:c a_&V;vvn"s#Q0     你可以把你程序的输入/输出重定向。51Testing软件测试网0JHZ1g,Qma
例如:
$}tnt#K4^0     run > outfile51Testing软件测试网Z5{_3?i R e-N
运行你的程序并把你程序的标准输出写入文件outfile中。
2]1d OGNN@T.Zb-Z0   另一个为你程序指定输入/输出的方法是使用'tty'命令,这个命令51Testing软件测试网\DI%?6|c/@
接受一个文件名作为参量把这个文件作为以后使用'run'命令的缺省命51Testing软件测试网$bW [ D,cf O#J m1s
令文件。它还重新为子进程设置控制终端。
7L'|/E:t{0n0例如:
+V%t)Cc(M.t/h0     tty /dev/ttyb51Testing软件测试网g m6oKIj
指定以后用'run'命令启动的进程使用终端'/dev/ttyb'作为程序的输入
.N%SDF9qT*e Rv0/输出,而且把这个终端设为你进程的控制终端。
V?6h-uj"J7g0   一个清楚的使用'run'命令的重定向将重新设置'tty'所设置的内容51Testing软件测试网WD j:oD [x ]:D(O
,但不影响控制终端。   当你使用'tty'命令或在'run'命令中对输入
f V/n)n#yx0/输出进行重定向时,只有你当前调试的程序的输入/输出被改变了,
L0YZX4cd4b0并不会影响到别的程序。
1] }fWo:{J5c0调试一个已经运行的程序:51Testing软件测试网)j:HDyh-Y8N
====================================
UzgoW7]0A3\2RZ0 51Testing软件测试网)U!C3H hh
`attach PROCESS-ID'51Testing软件测试网;h1dx-G pj/^
     这个命令把一个已经运行的进程(在gdb外启动)连接入gdb,以便
PI!G,B*Q h?(m;f{0调试。PROCESS-ID是进程号。(UNIX中使用'ps'或'jobs -l'来查看进程)
y7Z |zd |q+O!_eJ0     'attach'一般不重复。(当你打了一个以上的回车时)51Testing软件测试网^]&I_ r\#P
   当然要使用'attach'命令的话,你的操作系统环境必须支持进程。
_-^B9]zEU/A}0另外你还要有向此进程发信号的权力。51Testing软件测试网kM6Zx6ni/E&U-Wmg
   当使用'attach'命令时,你应该先使用'file'命令来指定进程所51Testing软件测试网@)hOth)x9_8ZJ
联系的程序源代码和符号表。   当gdb接到'attach'命令后第一件51Testing软件测试网 m;r)uk+uhVC-{;p A
事就是停止进程的运行,你可以使用所有gdb的命令来调试一个“连接”
O-[W*~g9q ZP0的进程,就象你用'run'命令在gdb中启动它一样。如果你要进程继续运51Testing软件测试网}SP@.ql?$~O
行,使用'continue'或'c'命令就行了。51Testing软件测试网(X|8V*m~1gk9C
`detach'
"R,k y3Ka2| H0   当你结束调试后可以使用此命令来断开进程和gdb的连接。(解除gdb
8m:o1G:my+i`0对它的控制)在这个命令执行后进程将继续执行。
.e#T_SY"k.B0   如果你在用'attach'连接一个进程后退出了gdb,或使用'run'命令执51Testing软件测试网"gRD)Az(h
行了另一个进程,这个被'attach'的进程将被kill掉。但缺省时,gdb会51Testing软件测试网Z$X5F,HMA)T a&Ji
要求你确认你是否要退出或执行一个新的进程。51Testing软件测试网8l c _2{M^|`A&I
 

V7ZI+p.I&h3C0

0f$jG7S;X5h%Risf0 

Kl2Mxf,m051Testing软件测试网5tZFwM j

结束子进程
C;z;C8^X"JcO UF0=========================51Testing软件测试网?/HH]p9M Go
`kill'51Testing软件测试网i\j jiJ(d
     Kill命令结束你程序在gdb下开的子进程
*GRf V,[cR5M0     这个命令当你想要调试(检查)一个core dump文件时更有用。gdb在调试过程中
nE'd4k0sCj0会忽略所有的core dump。
n/HL-e?c1|nkU0   在一些操作系统上,一个程序当你在上面加了断点以后就不能离开gdb独立运行。
?3nC d,d,mX Y0你可以用kill命令来解决这个问题。
:[FaW6fG*[y0   'kill'命令当你想重新编译和连接你的程序时也很有用。因为有些系统不允许修改51Testing软件测试网coA y:}
正在执行的可执行程序。这样当你再一次使用'run'命令时gdb会知道你的程序已经被改51Testing软件测试网+J,Yl$d_cq*BcTG;O
变了,那么gdb会重新load新的符号。(而且尽量保持你当前的断点设置。51Testing软件测试网/_A y*ko'W F
附加的进程信息
c6K8s*c)DPJ'n^m0==============================51Testing软件测试网:V g;ix8O }NL9ZF2ml
   一些操作系统提供了一个设备目录叫做'/proc'的,供检查进程映象。如果gdb被在这
t/P,R }[+}6q0样的操作系统下运行,你可以使用命令'info proc'来查询进程的信息。('info proc'命
I2poMB:O0令只在支持'procfs'的SVR4系统上有用。51Testing软件测试网:] @x&wO
`info proc'
)p?4U(H'hr8n0     显示进程的概要信息。51Testing软件测试网RDJgn&T
`info proc mappings'
{FR7z5Wo0     报告你进程所能访问的地址范围。
ec/`@}9af0`info proc times'51Testing软件测试网)Z~7ju/dzN*q6Y$R"WGcF
     你进程和子进程的开始时间,用户时间(user CPU time),和系统CPU时间。
v8Z sJ JGU @0`info proc id'
h @.eXP-A%z$h0     报告有关进程id的信息。
q?.pq8Wo-z0`info proc status'
#h es sbE2XM/r0     报告你进程的一般状态信息。如果进程停止了。这个报告还包括停止的原因和收到的
[-U{5a e:i0信号。51Testing软件测试网'E i tM0lm3|
`info proc all'51Testing软件测试网:z{1xi4`;F
     显示上面这些命令返回的所有信息。
$M4Q$d ku9Z7P1q0对多线程程序的调试
R p J:x CZR"pj0========================================51Testing软件测试网dOj^`z'iS
   一些操作系统中,一个单独的程序可以有一个以上的线程在运行。线程和进程精确的定?nbsp;
%{f(XNS~[(K0C0?nbsp;51Testing软件测试网j rHL*?~*zdMF/l
 51Testing软件测试网 k-A EdA,V:meIH
?nbsp;
p O]!e}*iT"U0?nbsp;51Testing软件测试网+K:oN BCP[ c
有自己的寄存器,运行时堆栈或许还会有私有内存。51Testing软件测试网0iwJG0j\5x.`:d-q
   gdb提供了以下供调试多线程的进程的功能:
0C_ A$Qw0   * 自动通告新线程。51Testing软件测试网6| y|Rnr-\!W
   * 'thread THREADNO',一个用来在线程之间切换的命令。51Testing软件测试网*upnkpr6po C
   * 'info threads',一个用来查询现存线程的命令。51Testing软件测试网:r+y;~ k?cTL$f
   * 'thread apply [THREADNO] [ALL] ARGS',一个用来向线程提供命令的命令。
#J8iKw&G%Ds/s0   * 线程有关的断点设置。
c&@r|;m0   注意:这些特性不是在所有gdb版本都能使用,归根结底要看操作系统是否支持。
A ^Rl'B+PF$D[%s0   如果你的gdb不支持这些命令,会显示出错信息:51Testing软件测试网mg~m"^#M2~
          (gdb) info threads51Testing软件测试网pcg'px%tt}K
          (gdb) thread 151Testing软件测试网T tK@.f
          Thread ID 1 not known.  Use the "info threads" command to51Testing软件测试网"vK5S!g:T~
          see the IDs of currently known threads.51Testing软件测试网O7k[8Y/t9W
   gdb的线程级调试功能允许你观察你程序运行中所有的线程,但无论什么时候
k(n li(c"Up/y0gdb控制,总有一个“当前”线程。调试命令对“当前”进程起作用。51Testing软件测试网'].g$R0zJ {8^c Z V
   一旦gdb发现了你程序中的一个新的线程,它会自动显示有关此线程的系统信51Testing软件测试网 ]BBc9b1f]7I
息。比如:51Testing软件测试网D"K t1~l R.o~
     [New process 35 thread 27]
9|eC.N5g4eV0不过格式和操作系统有关。51Testing软件测试网%RK_~/^$le"P0V
   为了调试的目的,gdb自己设置线程号。
Ke F+H | c}Q.qq e0`info threads'
(K:xpo4l.Z]0     显示进程中所有的线程的概要信息。gdb按顺序显示:
j&Riib)cQ0       1.线程号(gdb设置)
1Ur6jK#y,~.P0       2.目标系统的线程标识。
LCA"`f4^w0       3.此线程的当前堆栈。51Testing软件测试网B*k[\GG/g[
       一前面打'*'的线程表示是当前线程。51Testing软件测试网 {*gg^5B wc4bg2wj
     例如:
5L,C&A5b_[5Gql0     (gdb) info threads
:Iq7]G^$K$S@0       3 process 35 thread 27  0x34e5 in sigpause ()
G7f i8];d r([:V0       2 process 35 thread 23  0x34e5 in sigpause ()51Testing软件测试网3D;?HM1} L"aK]+\,t-d
     * 1 process 35 thread 13  main (argc=1, argv=0x7ffffff8)
K*[_i0E1x0         at threadtest.c:6851Testing软件测试网E1uCj!Lx6@ }
 51Testing软件测试网.y#B1^:WkfB

p`#Ki3F0 

+]7T5DQ H:o1}5q9uR0

s1W5j4zDQ0`thread THREADNO'51Testing软件测试网XJ8s7DPK nhb,n
     把线程号为THREADNO的线程设为当前线程。命令行参数THREADNO是gdb内定的51Testing软件测试网C*G+]{^3S
线程号。你可以用'info threads'命令来查看gdb内设置的线程号。gdb显示该线程
j4~3gW"\1W0的系统定义的标识号和线程对应的堆栈。比如:51Testing软件测试网 o"V?(jKGH]y&G
 
itYe j k0          (gdb) thread 2
OBs%Bw0Aq0          [Switching to process 35 thread 23]51Testing软件测试网d9MY t h#j
          0x34e5 in sigpause ()
;Qd/uz-c0     "Switching后的内容取决于你的操作系统对线程标识的定义。51Testing软件测试网7|b&V:B7b$d1|
 
AZ'p*t\aJ(zvE0`thread apply [THREADNO] [ALL]  ARGS'
8j]v{~kw0     此命令让你对一个以上的线程发出相同的命令"ARGS",[THREADNO]的含义同上。
(A#A`&Q1L5V1}([0如果你要向你进程中的所有的线程发出命令使用[ALL]选项。
F)L w Qs'H&nz0   无论gdb何时中断了你的程序(因为一个断点或是一个信号),它自动选择信号或51Testing软件测试网 n f'y KB:v,x S#k
断点发生的线程为当前线程。gdb将用一个格式为'[Switching to SYSTAG]'的消息
|[T%u,Y-U0来向你报告。
~ {*m#??x3z0   *参见:运行和停止多线程程序。51Testing软件测试网 x RH3p&V
   *参见:设置观察点
Cn jBmv"S0 
$S0I7F2wiG0T$`2L v$o0调试多进程的程序
7T l{ ?q6z^X5c,n0==========================================51Testing软件测试网 B5x,nd.b"g
   gdb对调试使用'fork'系统调用产生新进程的程序没有很多支持。当一个程序开始51Testing软件测试网)]we`'rB?B
一个新进程时,gdb将继续对父进程进行调试,子进程将不受影响的运行。如果你在子51Testing软件测试网!Q]@`Pg y@
进程可能会执行到的地方设了断点,那么子进程将收到'SIGTRAP'信号,如果子进程没
w"l m+hvmO/c+l?0有对这个信号进行处理的话那么缺省的处理就是使子进程终止。
X8[*SU0M(@H0   然而,如果你要一定要调试子进程的话,这儿有一个不是很麻烦的折衷的办法。在51Testing软件测试网8p kE.D{9O
子进程被运行起来的开头几句语句前加上一个'sleep'命令。这在调试过程中并不会引51Testing软件测试网%LE7LQ6QCxE
起程序中很大的麻烦(不过你要自己注意例外的情况幺:-))。然后再使用'ps'命令列出
4ug+_+`;f ]0新开的子进程号,最后使用'attach'命令。这样就没有问题了。51Testing软件测试网 So#O8K#b"RU
  关于这一段,本人觉得实际使用上并不全是这样。我在调试程中就试过,好象不一定51Testing软件测试网2J0J D%T;y
能起作用,要看gdb的版本和你所使用的操作系统了。51Testing软件测试网A _BIXxK
 

iG3wg%`C0

9@x(l1G},[x N;Kk%lK051Testing软件测试网ET1\IJY v
停止和继续51Testing软件测试网M;MK.Ja
***********************
{.[#jyCS(c+? `0   调试器的基本功能就是让你能够在程序运行时在终止之前在某些条件下停止下来,然51Testing软件测试网t W8g|}k
后再继续运行,这样的话你就可以检查当你的程序出错时你的程序究竟做了些什么。
\BQ0f2a+[0   在gdb内部,你的程序会由于各种原因而暂时停止,比如一个信号,一个断点,或是51Testing软件测试网2n}:lre|r)y3e1e?
由于你用了'step'命令。在程序停止的时候你就可以检查和改变变量的值,设置或去掉
y0ZkNrw0断点,然后继续你程序的运行。一般当程序停下来时gdb都会显示一些有关程序状态的信
GQS^%}(F;d#d0息。比如象程序停止的原因,堆栈等等。如果你要了解更详细的信息,你可以使用'info51Testing软件测试网%l(T+V M EVwJ,?]
program'命令。另外,在任何时候你输入这条命令,gdb都会显示当前程序运行的状态信51Testing软件测试网}~8fV:|;s'y
息。51Testing软件测试网G"onJZTpS
 
,y'd*n2YA P:^.|0`info program'51Testing软件测试网GQ(cNxvq1nn
     显示有关你程序状态的信息:你的程序是在运行还是停止,是什么进程,为什么停
KJ1uO!Xz0止。
6ucE6|H'Qe%]5S)H0 51Testing软件测试网J"g R9d4dAE^#U
断点,观察点和异常
(h$k^x.[-fG?0========================================51Testing软件测试网"^cp"Z_
   断点的作用是当你程序运行到断点时,无论它在做什么都会被停止下来。对于每个断点
3tH3H7M:x4eb0你都可以设置一些更高级的信息以决定断点在什么时候起作用。你可以使用'break’命令
vOY$Cz;_0来在你的程序中设置断点,在前面的例子中我们已经提到过一些这个命令的使用方法了。
4lX&Z"Y/{q}bs0你可以在行上,函数上,甚至在确切的地址上设置断点。在含有异常处理的语言(比如象
7_.?:^p0B:P3[I]N0c++)中,你还可以在异常发生的地方设置断点。51Testing软件测试网 Z4M!j m|.?5`rW
   在SunOS 4.x,SVR4和Alpha OSF/1的设置中,你还可以在共享库中设置断点。
F)w#a1\&Y4zG8s C0   观察点是一种特殊的断点。它们在你程序中某个表达式的值发生变化时起作用。你必51Testing软件测试网XAP|4Y2R ZzN5J
须使用另外一些命令来设置观察点。除了这个特性以外,你可以象对普通断点一样对观察
8PIDz?0点进行操作--使用和普通断点操作一样的命令来对观察点使能,使不能,删除。
U},r8l2km0v*l$@v0   你可以安排当你程序被中断时显示的程序变量。51Testing软件测试网"v\*d@1g1ab+zG
   当你在程序中设置断点或观察点时gdb为每个断点或观察点赋一个数值.在许多对断点
k j:e z eH0O0操作的命令中都要使用这个数值。51Testing软件测试网7c%]%WU kL
 

lg2V8r-?1R.\$V0

F$CgQ8Ll[q0 51Testing软件测试网Fbn,U1v7_-i

LE*r"dA0设置断点51Testing软件测试网3h/c*aXy
=============51Testing软件测试网X8_/JOc$XR/~v6S
   使用'break'或简写成'b'来设置断点。gdb使用环境变量$bpnum来记录你最新设置的
]'q c7HQAe!^+z\t0u0断点。
Txm {1r1r0   你有不少方法来设置断点。
!xT Ys1U0 
-X2um&t8P-b@0 
Gt|0G.^0`break FUNCTION'51Testing软件测试网eA7dp-W gz4}8u?
     此命令用来在某个函数上设置断点。当你使用允许函数重载的语言比如C++时,有可51Testing软件测试网myA&GpVfp*_
能同时在几个重载的函数上设置了断点。
:{ Z'Yq,{,?2{$S0 51Testing软件测试网2Q3UG9C0@I,N9a*MX
`break +OFFSET'51Testing软件测试网*XO'z9|!G+g
`break -OFFSET'
{TF:Z9xM0     在当前程序运行到的前几行或后几行设置断点。OFFSET为行号。51Testing软件测试网-g@ r-X0j
 51Testing软件测试网 oF }"U:Rol
`break LINENUM'
+l j%b([$`7{!O q0     在行号为LINENUM的行上设置断点。程序在运行到此行之前停止。51Testing软件测试网F^w-kXS{vA
 
cT}2eu wO0`break FILENAME:LINENUM'
M1X | E7oVQ0     在文件名为FILENAME的原文件的第LINENUM行设置断点。
V&o,o)`[*H-e~X0 
.m*y7U1h q @-}0`break FILENAME:FUNCTION'51Testing软件测试网'g@ US:q o8B6Xf
     在文件名为FILENAME的原文件的名为FUNCTION的函数上设置断点。51Testing软件测试网C ug3K6Gp6W-A9a
当你的多个文件中可能含有相同的函数名时必须给出文件名。
f ^RH(A4c i0 51Testing软件测试网&?H`)c)P2S9l R
`break *ADDRESS'
^ `^D6@D!v0     在地址ADDRESS上设置断点,这个命令允许你在没有调试信息的程51Testing软件测试网;@X}/T;wn D7iF
序中设置断点。
`(SKAT7u^ ?\0`break'51Testing软件测试网 k3W\ \Io `;q2p
     当'break'命令不包含任何参数时,'break'命令在当前执行到的程51Testing软件测试网M\ Q,q*d
序运行栈中的下一条指令上设置一个断点。除了栈底以外,这个命令使51Testing软件测试网0KQ[&D3?+d.n
程序在一旦从当前函数返回时停止。相似的命令是'finish',但'finish'51Testing软件测试网1lx d~#g|Ll
并不设置断点。这一点在循环语句中很有用。51Testing软件测试网lK[_m~"C:RW&CM
     gdb在恢复执行时,至少执行一条指令。
$bLz$BE6r%wH0 
&\kX"OP6]0`break ... if COND'51Testing软件测试网YU5wn/?o:K9E7\*b
     这个命令设置一个条件断点,条件由COND指定;在gdb每次执行到此51Testing软件测试网)Su$L0T Q M0A
断点时COND都被计算当COND的值为非零时,程序在断点处停止。这意味着51Testing软件测试网pT/Kjl'S1@_
COND的值为真时程序停止。...可以为下面所说的一些参量。
9tyMO b1k0 
.[[%yg t+h%qA0`tbreak ARGS'51Testing软件测试网7g.\)sySm#U B
     设置断点为只有效一次。ARGS的使用同'break'中的参量的使用。51Testing软件测试网@ufKP^5q2d
 51Testing软件测试网-KOsGS5I
`hbreak ARGS'
5i)pUy9T6X |la;C0     设置一个由硬件支持的断点。ARGS同'break'命令,设置方法也和
x jy5{ B.x0i0'break'相同。但这种断点需要由硬件支持,所以不是所有的系统上这个
+Et2X"NB,XIY(I0命令都有效。这个命令的主要目的是用于对EPROM/ROM程序的调试。因为51Testing软件测试网E0W/vb Nh-C
这条命令可以在不改变代码的情况下设置断点。这可以同SPARCLite DSU
8`t9E1pzH(Q3T/t0一起使用。当程序访问某些变量和代码时,DSU将设置“陷井”。注意:51Testing软件测试网$dC9@:y B_!D!i8i0V
你只能一次使用一个断点,在新设置断点时,先删除原断点。
{ J&^/PY!HV ^T7ml0 51Testing软件测试网r.D&Tls(B ?F j

51Testing软件测试网j(WR.c1g0n,\


#n M7zL6GB6`0`thbreak ARGS'
9avReqs5Uv0     设置只有一次作用的硬件支持断点。ARGS用法同'hbreak'命令。这个命令
7C5YM4FC0和'tbreak'命令相似,它所设置的断点只起一次作用,然后就被自动的删除。这
hY}z`g&p0个命令所设置的断点需要有硬件支持。
'? n:c@w%`O0 
"m"a6A?;@D$T0`rbreak REGEX'51Testing软件测试网uDf6Gc/h;n
     在所有满足表达式REGEX的函数上设置断点。这个命令在所有相匹配的函数51Testing软件测试网1m W/D2G4I
上设置无条件断点,当这个命令完成时显示所有被设置的断点信息。这个命令设51Testing软件测试网 W1G%HJnfU E
置的断点和'break'命令设置的没有什么不同。这样你可以象操作一般的断点一
H _V8ii.I E&p0样对这个命令设置的断点进行删除,使能,使不能等操作。当调试C++程序时这51Testing软件测试网#q p-v0|"T
个命令在重载函数上设置断点时非常有用。51Testing软件测试网9DL @Ts![Z"` A
 
1[W#x/_Ln A0`info breakpoints [N]'51Testing软件测试网2w!j0M+|S]3Q
`info break [N]'51Testing软件测试网%b,| }PXP,h
`info watchpoints [N]'
(K)Kw3UX:eP y0     显示所有的断点和观察点的设置表,有下列一些列51Testing软件测试网&y |3t` w6jN\
 51Testing软件测试网q0CM&?*N5~!x{
    *Breakpoint Numbers*----断点号51Testing软件测试网}&K*A2Qu9If
    *Type*----断点类型(断点或是观察点)
,hIf$P"nA9?&RF vul0    *Disposition*---显示断点的状态。51Testing软件测试网n,YS@8}#a Xt
 
'I*K h2c}3v-R0    *Enabled or Disabled*---使能或不使能。'y'表示使能,'n'表示不使能。51Testing软件测试网/m3M4}_*w| I|
 51Testing软件测试网/O P(O:\B
    *Address*----地址,断点在你程序中的地址(内存地址)
`/V$Hva MlC#L0    *What*---地址,断点在你程序中的行号。51Testing软件测试网(W!a&iS&?~)O%T
     如果断点是条件断点,此命令还显示断点所需要的条件。51Testing软件测试网H @*}k#Wy4Q
     带参数N的'info break'命令只显示由N指定的断点的信息。
(o9Ys*O4nC p Z0     此命令还显示断点的运行信息(被执行过几次),这个功能在使用'ignore'51Testing软件测试网"zAsU%Zs
命令时很有用。你可以'ignore'一个断点许多次。使用这个命令可以查看断点51Testing软件测试网kDp^E7Q"k)}z2M
被执行了多少次。这样可以更快的找到错误。
im7j!O*f1O[!Y0    gdb允许你在一个地方设置多个断点。但设置相同的断点无疑是弱智的。不过
biMh@0你可以使用条件断点,这样就非常有用。51Testing软件测试网wiM.sH|d
   gdb有时会自动在你的程序中加入断点。这主要是gdb自己的需要。比如为了正51Testing软件测试网l {H6N{;PZ2e'k({
确的处理C语言中的'longjmp'。这些内部断点都是负值,以'-1'开始。'info
|*T6A%aCA0breakpoints'不会显示它们。
1ucA$c9md0   不过你可以使用命令’maint info breakpoints'来查看这些断点。51Testing软件测试网C?6c&n q2N)H
 51Testing软件测试网Aya}+Tv
`maint info breakpoints'51Testing软件测试网0`r0{Ay7l E)C(}
     使用格式和'info breakpoints'相同,显示所有的断点,无论是你设置的还是51Testing软件测试网#m1h4P sERP`
gdb自动设置的。51Testing软件测试网&fV"}9q.B9Lrf
     以下列的含义:
d"F Q~ i/V1\*bjv${0 
BH#V&Oe&E#pt?)W0    `breakpoint'
6Z b*EyQJz;B0          断点,普通断点。51Testing软件测试网/{8N/GK&@9`kX
    `watchpoint'51Testing软件测试网|uMmFBxpy
          普通观察点。51Testing软件测试网:xW'R2Mve
 
OD-E ]j1Z0    `longjmp'
;C&D\!T|0          内部断点,用于处理'longjmp'调用。
%Ox1n^R&@O0 51Testing软件测试网8T;H0J$GTM}
    `longjmp resume'
;j v}2E[b!P;J%vVAG0          内部断点,设置在'longjmp'调用的目标上。
'B1usz4z4A9} f8j0 
$gd _4iIcs&s |0    `until'51Testing软件测试网0g7|-I`^^5]+x;m^%j
          'until'命令所使用的内部断点。51Testing软件测试网LaV*^QDQ
 51Testing软件测试网 s$jK Ap
    `finish'
0}@J9^q,J8nnv\0          'finish'命令所使用的内部断点。
N-c{Z2J%H0 51Testing软件测试网%[#}{cO

)Bt#pR/S qhhd0 

5EZ2?*Gf4Q8E9m051Testing软件测试网?1W1G_8BDF

设置观察点
9mB@$bW7BIk0==============
YH2goR E6w0   你可以使用观察点来停止一个程序,当某个表达式的值改变时,观察点会将程序
S ^1xYI0停止。而不需要先指定在某个地方设置一个断点。51Testing软件测试网)uAHY+MUp e3v
   由于观察点的这个特性,使观察点的使用时开销比较大,但在捕捉错误时非常有
D.y5l6n;C?0t0用。特别是你不知道你的程序什么地方出了问题时。51Testing软件测试网y1GL{1@Q }t&](i.a
 
q |g-c5E-d#X0`watch EXPR'
H1Lh*_ V#]/B8F0     这个命令使用EXPR作为表达式设置一个观察点。GDB将把表达式加入到程序中51Testing软件测试网p` Yo(X;| q ]/N(qR
并监视程序的运行,当表达式的值被改变时GDB就使程序停止。这个也可以被用在
-FW,kT HGo0N0SPARClite DSU提供的新的自陷工具中。当程序存取某个地址或某条指令时(这个地
:Od]'O4O0址在调试寄存器中指定),DSU将产生自陷。对于数据地址DSU支持'watch'命令,然而51Testing软件测试网7Yq5I }Y1q:`0A(w
硬件断点寄存器只能存储两个断点地址,而且断点的类型必须相同。就是两个
i)n.x*F0D`0'rwatch'型断点,或是两个'awatch'型断点。51Testing软件测试网 J{8yTVyWY2K
 
${%aGz-l$r^ Jxv0`rwatch EXPR'51Testing软件测试网A [:l:c]f
     设置一个观察点,当EXPR被程序读时,程序被暂停。51Testing软件测试网PW-d}1A\T r
 
/S jW_ K?0`awatch EXPR'51Testing软件测试网J/X|-ij8s#Y4YH5T_6A
     设置一个观察点,当EXPR被读出然后被写入时程序被暂停。这个命令和'awatch'
*SB)M/|a[/J-X}C&_1n0命令合用。51Testing软件测试网,} f"Cr*d{n;U
 51Testing软件测试网Xr&dn;Gy#]/N
`info watchpoints'51Testing软件测试网 nH] ig l Pv
     显示所设置的观察点的列表,和'info break'命令相似。
w yl`%?vk1H0     *注意:*在多线程的程序中,观察点的作用很有限,GDB只能观察在一个线程中
?E:v:oAg0的表达式的值如果你确信表达式只被当前线程所存取,那么使用观察点才有效。GDB
?$erV r Q4R\0不能注意一个非当前线程对表达式值的改变。
7M5{Fe,n0 51Testing软件测试网cpqno|W
断点和异常51Testing软件测试网,Z6b:_(j p~9E
==============51Testing软件测试网Yk6Gf F4Q I
   在一些语言中比如象GNU C++,实现了异常处理。你可以使用GDB来检查异常发生的
L P!A|GY*H0原因。而且GDB还可以列出在某个点上异常处理的所有过程。51Testing软件测试网2apPt*[3|7E
 51Testing软件测试网&r.|9aCq[
`catch EXCEPTIONS'
^P&ckH%G0     你可以使用这个命令来在一个被激活的异常处理句柄中设置断点。EXCEPTIONS是51Testing软件测试网;d uN lX+c
一个你要抓住的异常。51Testing软件测试网2o W kG vha4|
     你一样可以使用'info catch'命令来列出活跃的异常处理句柄。51Testing软件测试网 JV+y@s
     现在GDB中对于异常处理由以下情况不能处理。
{7W'AN1Y sC]0   * 如果你使用一个交互的函数,当函数运行结束时,GDB将象普通情况一样把控制返
J|oYR,W^HAnu0回给你。如果在调用中发生了异常,这个函数将继续运行直到遇到一个断点,一个信号51Testing软件测试网V5k]W'M'U;Nlh
或是退出运行。
3gB(alo3E0   * 你不能手工产生一个异常( 即异常只能由程序运行中产生 )
c"f7gZ%E[@0   * 你不能手工设置一个异常处理句柄。
/J8q-~n oo0   有时'catch'命令不一定是调试异常处理的最好的方法。如果你需要知道异常产生的51Testing软件测试网imOu]$Tr|.F
确切位置,最好在异常处理句柄被调用以前设置一个断点,这样你可以检查栈的内容。51Testing软件测试网#D%Y B$e0My,y
如果你在一个异常处理句柄上设置断点,那么你就不容易知道异常发生的位置和原因。51Testing软件测试网:\.r2j-w!Zz bu8x
   要仅仅只在异常处理句柄被唤醒之前设置断点,你必须了解一些语言的实现细节。
b1ebs+w*]GU2s0比如在GNU C++中异常被一个叫'__raise_exception'的库函数所调用。这个函数的原
"SU9VB V;gL.R z$W$H0型是:51Testing软件测试网]UG4sGSX
 
6YH(r oY?}0         /* ADDR is where the exception identifier is stored.
Tu&~f"uRIV~1x0            ID is the exception identifier.  */51Testing软件测试网&sqk;Q4R{
         void __raise_exception (void **ADDR, void *ID);51Testing软件测试网"~PQ2q-^'}
要使GDB在栈展开之前抓住所有的句柄,你可以在函数'__raise_exception'上设置断点。51Testing软件测试网)B.w}_#v;bR x
   对于一个条件断点,由于它取决于ID的值,你可以在你程序中设置断点,当某个特
{sP?|+W\ T0别的异常被唤醒。当有一系列异常被唤醒时,你可以使用多重条件断点来停止你的程序。51Testing软件测试网 O ~?7W2R bEn@
 51Testing软件测试网(z7JBc H|

51Testing软件测试网3N5Sl;] i1pH

 51Testing软件测试网m$Kq3NQ&py8F

51Testing软件测试网.O)e-d@:A%O0@

删除断点
P p3CFizXr0===================51Testing软件测试网d;Z&i_.LE&B
   很自然当一个断点或是一个观察点完成了它的使命后,你需要把它从程序中删去。
Ai3o M:cTH0不然你的程序还会在相同的地方停主,给你造成干扰。使用'clear'命令来从程序中删去51Testing软件测试网a-w#NXJ.GN%d v
一个断点。51Testing软件测试网+@!r$lY8W
   使用'clear'命令你可以删除指定位置的断点。使用'delete'命令你可以使用断点号
)r'F`i}F4c E0来指定要删去的断点或观察点。51Testing软件测试网1TY L2n!l0u"B{T
   在删除断点时不需要先运行过它,GDB会忽略你刚才删去的断点。所以你可以继续运行51Testing软件测试网h0R4Z4?]O
你的程序而不必管断点。51Testing软件测试网o_3M/H+\*Rwo9U
 51Testing软件测试网1I@-\vl"Z/{
`clear'51Testing软件测试网kOa-Bl hN U
     在当前选择的栈帧上清除下一个所要执行到的断点(指令级)。当你当前选择帧是栈中
)H%ckC BN ?0最内层时使用这个命令可以很方便的删去刚才程序停止处的断点。
Q1|9UT$\"Z0 51Testing软件测试网;I"M)Dp0GW7S/O@
`clear FUNCTION'
"K1^)A0|(j?nV0`clear FILENAME:FUNCTION'51Testing软件测试网.{C _R$Q4e
     删除名为FUNCITON的函数上的断点。
CH?2TEX)s0 51Testing软件测试网?;U ~4s0`?K.Eu%rc
`clear LINENUM'51Testing软件测试网DM7g*Kx;~I w
`clear FILENAME:LINENUM'51Testing软件测试网8e(|q%f2wVg*A
     删除以LINENUM为行号上的断点。
2S U(Oisx$q*toKf0 
:BV8qE il_5d0`delete [breakpoints] [BNUMS...]'
4pm u&^1p3v#pksN0     删除参数所指定的断点,如果没有指定参数则删去程序中所有的断点。这个命令可以51Testing软件测试网QA6w7lX4]v;mzk
缩写成为'd'
;y:`%Doy7X9t0y+t0 51Testing软件测试网 dIP(c+\ G
使断点暂时不起作用。51Testing软件测试网L ?2M\6O#}5hdW
========================51Testing软件测试网h u(k'B \3l
   如果你只是想让断点一时失去作用以方便调试的话,你可以先使断点不起作用。
G @)]|)C:hP2u;t0当你以后又想使用时可以用'enable'命令激活它们。
@7Y9L#mNVa0   你使用'enable'命令来激活断点或是观察点,使用'disable'命令来使断点或观察点51Testing软件测试网$JK\ly0R1N
不起作用。使用'info break'或'info watch'来查看那些断点是活跃的。51Testing软件测试网2dtq+iy8YmL
   断点或观察点有四种状态:51Testing软件测试网sFB3o\*DU z
   * 使能。当程序运行到断点处时,程序停止。使用'break'命令设置的断点一开始缺省51Testing软件测试网:fdn'X;y__
是使能的。
e/]9lYj,\g/Le0   *不使能。断点对你程序的运行没有什么影响。51Testing软件测试网v\7Z)@j1Y1NvF8x%E
   *使能一次后变为不使能。断点对你的程序运行只有一次影响,然后就自动变成不使能51Testing软件测试网4rxd3]9k3N"u~"S
状态。使用'tbreak'设置的断点一开始缺省是这个状态。51Testing软件测试网pePkKC,_`Q ?I7s
   * 使能一次自动删除。断点在起了一次作用后自动被删除。
?8aWi`H x0   你可以使用以下的命令来使能或使不能一个断点或观察点。51Testing软件测试网}hYI#Be*E6F
 51Testing软件测试网6hh y*m1V
`disable [breakpoints] [BNUMS...]'
f7?G1Acw@0     使由参数指定的断点或观察点变为不使能,如果没有参数的话缺省使所有断点和观察51Testing软件测试网8O:TZrz/N |%TJ
点变为不使能。当一个断点或观察点被不使能后在被不使能前的状态被记录下来,在断点或51Testing软件测试网}8Q/A1H)? n7LB
观察点再次被激活时,原来的状态得到继续。比如一个条件断点或一个设置了51Testing软件测试网 wa){'hE1_q)A"} \
'ignore-counts'的断点在被使不能后记录活跃时断点被执行的次数,在不使能状态下,断51Testing软件测试网'M E]3K_,L[#`
点的执行次数(ignore-counts)不增加,直到断点再次被激活时,再继续计算条件
O4NDq/h2agQQ`0(ignore-counts)。你可以使用'disable'命令的缩写'dis'51Testing软件测试网|[sP^]%f#Y
 51Testing软件测试网#y,Vx6ejt
`enable [breakpoints] [BNUMS...]'51Testing软件测试网2E9OYil$g/R)nI
     使能由参数指定的断点或全部断点。
c,yqpGLh0 
o(Slf'n$n7iV:v @.J0`enable [breakpoints] once BNUMS...'51Testing软件测试网?*c K&?o#_NM8O
     功能同上条命令,只是这条命令使断点只使能一次。51Testing软件测试网-cf5@Lh"_!x
 51Testing软件测试网 z[)\ VZ1hF
`enable [breakpoints] delete BNUMS...'51Testing软件测试网f7F` Ku*^ Q0_
     功能同上条命令,只是这条命令使被使能的断点起作用一次然后自动被删除。
E%` D?!K(APB0     除了使用'tbreak'命令所设置的断点以外,断点被设置时都是使能的。
N)k&q#MRX0 

fSt Nt A~0

}B[IV vs0 51Testing软件测试网k2?D.jfMX

Y:~ Im3^Q E:Fu-}0断点条件51Testing软件测试网Y K ^7~-ZlJ dJt
===========
bt.y:k3p C&Rk0   最简单的断点就是当你的程序每次执行到的时候就简单将程序挂起。你也可以为断点51Testing软件测试网9FY[ ^f{
设置“条件”。条件只是你所使用的编程语言的一个布尔表达式,带有条件表达式的断点51Testing软件测试网x%`6Yo3F+u*g
在每次执行时判断计算表达式的值,当表达式值为真时才挂起程序。
;}3V.@7\8zR0XAuc(o0   这是使用“断言”的一中形式,在这种形式中你只有在断言为真时才挂起程序。如果51Testing软件测试网6]7e5|wx AY/~6O
在C语言中你要使断言为假时挂起程序则使用:“!表达式”。
7F4c p_"S#b,[#vi(G0i0   条件表达式对观察点也同样有效,但你并不需要它,因为观察点本身就计算一个表达式?nbsp;
^ q4@;}fL0?nbsp;51Testing软件测试网&R)l Z{m~)A
但它也许会简单一些。比如只在一个变量名上设置观察点然后设置一个条件来测试新的赋51Testing软件测试网?JC!g;dQyp
值。
['Q[F1c8DJ ]h ~&wz0  断点条件可能有副作用(side effects)会影响程序的运行。这一点有时也是很有用的
/q GAl-~!H0比如来激活一个显示程序完成情况的的函数,或使用你自己的打印函数来格式化特殊的
Pp7[a)yGV,O0数据结构。当在同一位置没有另一个断点设置时,结果是可预见的。(在gdb中如果在同一
,p6E||{5?Orhh:{0个地方使用了一个断点和一个条件断点则普通断点可能先被激活。)在条件断点的应用上
@7KOB e3U[0有很多技巧。51Testing软件测试网p5M W+U)z5R_-Mb4c
   断点条件可以在设置断点的同时被设置。使用'if'命令作为'break'命令的参数。断点
|!Y/[t b$b2s0|.I7}u'M0条件也可以在任何时候使用'condition'命令来设置。'watch'命令不能以'if'作为参数51Testing软件测试网s/h Cq5J1w$I
 
U&y+Q.s"\ xk ~0所以使用'condition'命令是在观察点上设置条件的唯一方法。
M%m!{z:P1}4c0 
2y&J,H.H!n;F2CV0`condition BNUM EXPRESSION'
']c6K:VI0b d2D0     把'EXPRESSIN'作为断点条件。断点用'BNUM'来指定。在你为BNUM号断点设置了条件51Testing软件测试网 W jm4~ pDR`2R
后,只有在条件为真时程序才被暂停。当你使用'condition'命令GDB马上同步的检查
_;`3iHw:VR^yto&H0'EXPRESSION'的值判断表达式中的符号在断点处是否有效,但GDB并不真正计算表达式51Testing软件测试网a"M{d5NX s3H*u%`E,q
的值。51Testing软件测试网,mH S^;o sy-n
 51Testing软件测试网 R.L)RKkRE
`condition BNUM'
Bp W&GhU4j C0     删除在'BNUM'号断点处的条件。使之成为一个普通断点。
!M0s9ZKH0   一个条件断点的特殊例子是时一个程序在执行了某句语句若干次后停止。由于这51Testing软件测试网U C@N\9Y4]
个功能非常常用,你可以使用一个命令来直接设置它那就是'ignore count'。每个
nBYq,xr0断点都有'ignore count',缺省是零。如果'ignore count'是正的那么你的程序在
9C/g{Cb0运行过断点处'count'次后被暂停。51Testing软件测试网][ZO-n,c b8l
 51Testing软件测试网V Y:V6[ XC
`ignore BNUM COUNT'
I7NH zM0\5K%?0     设置第BNUM号断点的'ignore count'为'COUNT'。51Testing软件测试网,Zy;l9gz)bEZWh
     如果要让断点在下次执行到时就暂停程序,那么把'COUNT'设为0.51Testing软件测试网+l"HE/A"db|/k
     当你使用'continue'命令来继续你程序的执行时,你可以直接把'ignore count'51Testing软件测试网G*\#gGHl{
作为'continue'的参数使用。你只要直接在'continue'命令后直接跟要"ignore"的
m*_8n(vEx,Q_E0次数就行。
|8Oj\1h9T0     如果一个断点同时有一个ignore count和一个条件时,条件不被检查。只有当51Testing软件测试网;Ei1o[E&Bg
'ignore count'为零时GDB才开始检查条件的真假。
{2L}"c9~ q#H0     另外你可以用'condition'命令来获得与用‘ignore count'同样效果的断点。用法
}^jj\;`|!lu2|0是用类似于'$foo--<=0'的参量作为'condition'命令的参数(使用一个不停减量的变量
+[!nN6e va[_#Ip0作为条件表达式的成员)。
(|)g6^'i4\,|&iT0 51Testing软件测试网5ktCUo8X#Z+Y(Q

q oA\,t9A y0 

4^!o'V%|V-ASl0

OG8hX/G r v0断点命令列表
+Lz5]L"Nu0==================
C/HC0M"^ lC0   你可以为任一个断点或观察点指定一系列命令,当你程序执行到断点时,GDB自动执行
cF I2y c;e0这些命令。例如:你可以打印一些表达式的值,或使能其他的断点。
"QvM;G^r0 51Testing软件测试网 moOS5I oH;ky
`commands [BNUM]'
2BURJV0`... COMMAND-LIST ...'
*i5K2Vt2D#K-c0`end'
4mz/P3d r5}%H)\~0     为断点号为BNUM的断点设置一个命令列表。这些命令在'...COMMAND-LIST...'中列
fU.]4T;e;R E(s-d:}0出使用'end'命令来表示列表的结束。
j,tI T \7nPX0    要删除断点上设置的命令序列,你只需在'command'命令后直接跟'end'命令就可以
&w|;P.\;i%}0HF0了。51Testing软件测试网!v)Q0E%kl4en W x
    当不指定BNUM时,GDB缺省为最近遇到的断点或是观察点设置命令列表。51Testing软件测试网%a~x,ZD#Pz
    使用回车来表示重复使用命令的特性在'...command list...'中不能使用。
oG(y&R6C7_4k0MF @'{0    你可以使用命令列表中的命令来再次使你的程序进入运行状态。简单的在命令列表
~ [\_(DC-ivM0中使用'continue'命令,或'step'命令。
5Y!LTc)ehw J0    在使程序恢复执行的命令后的命令都被忽略。这是因为一旦你的程序重新运行就可
(s+x[8^[l l}0能遇到新的命令列表,那么就应该执行新的命令。防止了二义。
D/xS Xns0    如果你在命令列表中使用了'silent'命令,那么你程序在断点处停止的信息将不被51Testing软件测试网#~j;W D f+{]V2^
显示。这对于用一个断点然后显示一些信息,接着再继续执行很有用。但'silent'命令51Testing软件测试网%b#rGEjQ*Cfn
只有在命令列表的开头有效。
L~#K0K R!}0    命令'echo','output'和'printf'允许你精确的控制显示信息,这些命令在"silent"51Testing软件测试网BF@$RN6X)XD
断点中很有用。51Testing软件测试网ll)P&^ Ls.Qvu
   例如:这个例子演示了使用断点命令列表来打印'x'的值.
[*SHIZj6S,|0 51Testing软件测试网5jLb_-l[
     break foo if x>051Testing软件测试网 h$ZVm4r
     commands
QsDvhZ;m:s o6z}"m0     silent
8UxAfQ/nk!_qaBv0     printf "x is %d\n",x51Testing软件测试网Y\h:ahQ
     cont51Testing软件测试网 bQ`2P)gK h^5H}
     end
]#b&cD5sX]O j0   断点命令列表的一个应用是在遇到一个buf之后改正数据然后继续调试的过程。51Testing软件测试网m%HUu9t%["q"~/JK3s
使用命令来修改含有错误值的变量,然后使用'continue'命令继续程序的运行。51Testing软件测试网:iAFp]-Cpu
  使用'silent'命令屏蔽输出:51Testing软件测试网 te8z%o Wg)wP+D
 
V;^3|(Ya|0     break 40351Testing软件测试网k(T3xTl#_,U7F
     commands
`'X&@/MIXw'w0     silent
:f}J b'r~D~0     set x = y + 4
+f\;H a%c([0     cont
&F8ke v}cC-?0     end
oLs+Q+\ hF2zm{5mj0 51Testing软件测试网${A-dx8z#TG4~

0X GQE _~0 

3G qGb(J`h*Eu0

_C3dy3]`;{U0断点菜单
Hx,J+n1s0==============51Testing软件测试网p4M.IUU;w:Cp
   一些编程语言(比如象C++)允许一个函数名被多次使用(重载),以方便应用的使用。
wXU mC0当一个函数名被重载时,'break FUNCITON'命令向GDB提供的信息不够GDB了解你要设置
0EGD5?/ky?\4M s0断点的确切位置。如果你了解到这个问题,你可以使用'break FUNCITONS(TYPES)'命令
.[eP I,M1mcc6?0来指定断点的确切位置。否则GDB会提供一个函数的选择的菜单供你选择。使用提示符
!l|8d-O%I)WEO0'>'来等待你的输入。开始的两个选择一般是'[0] cancel'和'[1] all'输入1则在所有51Testing软件测试网C'T/hc,M-lx
同名函数上加入断点。输入0则退出选择。
zP$HDO.S0   下例为企图在重载的函数符号'String::after'上设置断点。
X+B{zb6X'I xir7G0     (gdb) b String::after51Testing软件测试网6DAW z V6})e
     [0] cancel51Testing软件测试网P2e2o LL C
     [1] all51Testing软件测试网kS E4V.Dq&g@R
     [2] file:String.cc; line number:86751Testing软件测试网 jp6l;s wR-z3X]-L$|
     [3] file:String.cc; line number:860
U0B1TU0Zf O4C0     [4] file:String.cc; line number:87551Testing软件测试网0y4H9["@.DH W.QA!Jj
     [5] file:String.cc; line number:853
Z ^D0Kq)b2V-[0     [6] file:String.cc; line number:84651Testing软件测试网z:n![4h| |
     [7] file:String.cc; line number:735
$DBG5eN7r8|c0     > 2 4 651Testing软件测试网f#Z~ wv[0N-F0\i&PQ
     Breakpoint 1 at 0xb26c: file String.cc, line 867.
/`,FcMa2`*`D2r4q0     Breakpoint 2 at 0xb344: file String.cc, line 875.
9N+J.I_c#d6l0     Breakpoint 3 at 0xafcc: file String.cc, line 846.51Testing软件测试网e{(NS|lc
     Multiple breakpoints were set.
l&^$v-t9S2].E0     Use the "delete" command to delete unwanted
%z+Z!Z&A i0      breakpoints.51Testing软件测试网6Y+^[$f5a-KXl
     (gdb)
1B-` F t:]oE@0 
p eH)[R5e+S k7|0

apJ6EXi)B0

TAG: GDB 软件开发

 

评分:0

我来说两句

Open Toolbar