GDB用法详解

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

51Testing软件测试网e"?:jq9G)u @AA

使用GDB:51Testing软件测试网%v|4C@ Jw
   本文描述GDB,GNU的原代码调试器。(这是4.12版1994年一月,GDB版本4。16)
^7bC$E{3gPI@0* 目录:
+YX-X#S k7I,T)zc0* 摘要:                        GDB的摘要51Testing软件测试网G6|!dk{ g
* 实例:                          一个使用实例51Testing软件测试网#I#]}2j*Ri~T Y8Q~^
* 入门:                        进入和退出GDB
r2a/o2T%G&W^0* 命令:                        GDB 的命令51Testing软件测试网z)N*J1i_B4T
* 运行:                        在GDB下运行程序
I9p9X7H#Y+lBb(x0* 停止:                        暂停和继续执行51Testing软件测试网.dW;L:D+nh z9s
* 栈:                          检查堆栈
KV@ xU8v6r Pe0* 原文件:                      检查原文件51Testing软件测试网YIwe}Uxg
* 数据:                        检查数据
c_6r%j d2cX(C0* 语言:                        用不同的语言来使用GDB
~ OOz'F0* 符号:                         检查符号表51Testing软件测试网5~I+u)r$T_3|"y7gm(@i
* 更改:                         更改执行51Testing软件测试网kXNj#XZkQd*[]
* GDB的文件                     文件
W$NIk:fL$w0* 对象                          指定调试对象
&p9H&Y8L)X.f4U8J9T0* 控制GDB                       控制
|~6m+}N0* 执行序列:                    执行一序列命令
MAOp0A\fEv1~0* Emacs:                        使GDB和Emacs一起工作51Testing软件测试网KCW#~4S,A [J{)^L
* GDB的bug:51Testing软件测试网m;is+I^1Q!]
* 命令行编辑:                  行编辑
?|:I.e^}_/Av0H"Q0* 使用历史记录交互:
|(G_SH,y} _2YYP0* 格式化文档:                  如何格式化和打印GDB文档
5O.A-hU Y"?H9aV0y0* 安装GDB :
(Sj.u&|1y&Gz/?0 
*H` d/~9ny}s9l Md0* 索引:
C L^9B*Y/kD0 51Testing软件测试网6W8WQ*I5J/N
GDB简介:51Testing软件测试网B+c&r ^6M6I$y$^
**************51Testing软件测试网$P vq3w$]q8]GB
 
d'mF-bi.K(x+P8H0   调试器(比如象GDB)能让你观察另一个程序在执行时的内部活动,或程序出错时
3v.L/~+W&og a0发生了什么。
2A3@;p[ atU&E0   GDB主要能为你做四件事(包括为了完成这些事而附加的功能),帮助你找出程序51Testing软件测试网Nq|LxA~
中的错误。
vbfcT&sV0   * 运行你的程序,设置所有的能影响程序运行的东西。51Testing软件测试网5Mct6s'O Q`
 
I:@@ L(J0   * 保证你的程序在指定的条件下停止。
Ccy"a3fCM"v/V'e(Wt ^0 
1z A(s!Hj4N"hYN9N0   * 当你程序停止时,让你检查发生了什么。51Testing软件测试网dDt|vW'W
 51Testing软件测试网#IT&V/k8Z
   * 改变你的程序。那样你可以试着修正某个bug引起的问题,然后继续查找另一
.?:u?5eZn!T0     个bug.51Testing软件测试网Q_ R0Mo/?E
 51Testing软件测试网2P qnl#M Rxn"e
   你可以用GDB来调试C和C++写的程序。(参考 *C 和C++)51Testing软件测试网G] A6^WGn
 51Testing软件测试网 H.O~BxT)s k
   部分支持Modula-2和chill,但现在还没有这方面的文档。
[m5`~ uJg_|/f0 
0v L%g1c-U)W,Qz ^"q0   调试Pascal程序时,有一些功能还不能使用。51Testing软件测试网._ }8e?3]0R9Q0o%L
 51Testing软件测试网9j+H8d;pJA
  GDB还可以用来调试FORTRAN程序,尽管现在还不支持表达式的输入,输出变量,
1@ F(w,Sie0或类FORTRAN的词法。51Testing软件测试网%Bw1P(j(wv M
* GDB是"free software",大家都可以免费拷贝。也可以为GDB增加新的功能,不
x%JC(qA i+Z!D0过可要遵守GNU的许可协议幺。反正我认为GNU还是比较不错的:-)51Testing软件测试网5Lj0Gdy/h
就这句话:
bf-J n.P0   Fundamentally, the General Public License is a license which says51Testing软件测试网l!`1XIh Y@L
that you have these freedoms and that you cannot take these freedoms
5PK6vI6m1F:qA;i/v0away from anyone else.51Testing软件测试网]4ek-oOh zB
GDB的作者:
{1]]F%i O)xN,AQ0   Richard Stallman是GDB的始作俑者,另外还有许多别的GNU的成员。许多人
U9pTLxc4b0为此作出了贡献。(都是老外不提也罢,但愿他们不要来找我麻烦:-))

1~?i+z `~`v0

U1B@jz0这里是GDB的一个例子:51Testing软件测试网N(k,p$cR&i5AD
        原文中是使用一个叫m4的程序。但很遗憾我找不到这个程序的原代码,
'~&`;`D:P8l0所以没有办法来按照原文来说明。不过反正是个例子,我就拿一个操作系统51Testing软件测试网qsZ#Gz Ni
进程调度原码来说明把,原代码我会附在后面。
$} Yjo'q;k DL/R7e y0        首先这个程序叫os.c是一个模拟进程调度的原程序(也许是个老古董了:-))。51Testing软件测试网1oW7w$bnr
先说明一下如何取得包括原代码符号的可执行代码。大家有心的话可以去看一下gcc的51Testing软件测试网k*rM+|{A2p4a p
man文件(在shell下打man gcc)。gcc -g <原文件.c> -o <要生成的文件名>
-?wsd0g&x f0-g 的意思是生成带原代码调试符号的可执行文件。51Testing软件测试网!B/Gd Io
-o 的意思是指定可执行文件名。51Testing软件测试网R"Ji:B~X Gj"D
(gcc 的命令行参数有一大堆,有兴趣可以自己去看看。)
"? ` g$_\2C6sX[0反正在linux下把os.c用以上方法编译连接以后就产生了可供gdb使用的可执行文件。
s1[*n%UZ/U0我用gcc -g os.c -o os,产生的可执行文档叫os.51Testing软件测试网S2g7\kk
然后打gdb os,就可进入gdb,屏幕提示:51Testing软件测试网;v0u Qvu3G9@
     GDB is free software and you are welcome to distribute copies
l[ f q5zVHv I0      of it under certain conditions; type "show copying" to see
(ox/tP Vx a2n+xEL0      the conditions.
vo m*vX6HT0     There is absolutely no warranty for GDB; type "show warranty"
6f(_4M$[7l(P&E0      for details.
lW?hXo9e|"eq(\!|s0 51Testing软件测试网SRt,x:_H
     GDB 4.16, Copyright 1995 Free Software Foundation, Inc...51Testing软件测试网 i/xc1j OJ[(D%\ f[ ^.f
 (gdb)
eBo^snH1d{0  (gdb)是提示符,在这提示符下可以输入命令,直到退出。(退出命令是q/Q)51Testing软件测试网qTK.rBc+nm+u
为了尽量和原文档说明的命令相符,即使在本例子中没用的命令我也将演示。
2T T~6Lt0首先我们可以设置gdb的屏幕大小。键入:51Testing软件测试网;g%j7\Mp'jMD2R2y8_
 (gdb)set width 7051Testing软件测试网K^8L4M+K0ii#}
就是把标准屏幕设为70列。
e*Q]@ O T~0  然后让我们来设置断点。设置方法很简单:break或简单打b后面加行号或函数名51Testing软件测试网r0~d$FxlLC
比如我们可以在main 函数上设断点:51Testing软件测试网r'cTC iv%~f0CY
 (gdb)break main
z:Y#V J]G6}0或(gdb)b main51Testing软件测试网}f2a g/Brw!Z
 系统提示:Breakpoint 1 at 0x8049552: file os.c, line 455.51Testing软件测试网;No+_.B/r2m I
 然后我们可以运行这个程序,当程序运行到main函数时程序就会停止返回到gdb的51Testing软件测试网 mecjPQEMmx5l
提示符下。运行的命令是run或r(gdb中有不少alias,可以看一下help,在gdb下打help)51Testing软件测试网-K(VJ$iD~
run 后面可以跟参数,就是为程序指定命令行参数。
YX4[6@:v+Y0比如r abcd,则程序就会abcd以作为参数。(这里要说明的是可以用set args来指定参
!@8a }oWYn.E$j0数)。打入r或run后,程序就开始运行直到进入main的入口停止,显示:51Testing软件测试网0@;na%?I:]:?
Starting program: <路径>/os51Testing软件测试网5y~0g+Vq
 
W CLR7N&V'~ | b8Cd0Breakpoint 1, main () at os.c:45551Testing软件测试网H#y@ SU2b2?n
455            Initial();51Testing软件测试网8i,vv)D8~:w JU
这里455 Initial();是将要执行的命令或函数。51Testing软件测试网)cN:|(u;y ?
gdb提供两种方式:1.单步进入,step into就是跟踪到函数内啦。命令是step或s51Testing软件测试网.F8i]\UY ]-|4U(b
                 2.单步,next,就是简单的单步,不会进入函数。命令是next或n51Testing软件测试网 N-`vF Z fauD
这两个命令还有别的用法以后再说。
-Wzs(|#EB.e"p6Y0我们用n命令,键入:
!YX8Dp|e&[ ]5EV0(gdb)n51Testing软件测试网8g:C/n5M)~.x5N:c
Success forking process# 1 ,pid is 3147451Testing软件测试网3eQ#SG4A
 51Testing软件测试网&Mr+yI5gx {8zl
Success forking process# 2 ,pid is 3147551Testing软件测试网8y2It \ _7\xeWi
 51Testing软件测试网tuc+e&R
Success forking process# 3 ,pid is 3147651Testing软件测试网j;s.j Sz2p;w wXTT^
 51Testing软件测试网;d)^!l*dyk)d
Success forking process# 4 ,pid is 3147751Testing软件测试网'FRa4M krG4g
 51Testing软件测试网K4`d t6_
Success forking process# 5 ,pid is 3147851Testing软件测试网XTRtn Ap/BS
 
A;e1i?&xP8i4]y*a5T0Success forking process# 6 ,pid is 31479
^#i9zLA WB0 51Testing软件测试网;S,u!]t#d
                Dispatching Algorithm : FIFO51Testing软件测试网ryQ RI7^
********************************************************************************51Testing软件测试网+}zY(h5o"X2j2?"h"Rb~Q
 51Testing软件测试网&T1sE;R.r
            PCB#        PID     Priority        PC      State
+PHJ m#c0            1           31474      24            0      WAITING
EL`*lh\E:HO0            2           31475      19            0      WAITING
z(N.eTY,u P pQ)e N0            3           31476      16            0      WAITING51Testing软件测试网o$sb*[@ \H*c
            4           31477      23            0      WAITING
2N%N ^yWM2R0            5           31478      22            0      WAITING
:k3kS^6~7u X*?J!J0            6           31479      20            0      WAITING51Testing软件测试网$E"W$I?!~7O+YD3A
 
@ QaL$}{0_&M0******************************************************************************
U'Q,G.vQ8k0 51Testing软件测试网(UCW$BI/Et
CPU  :  NO process running51Testing软件测试网3nA1s:Z2c bt%|
IO :  No process
7t6jX?qG0Waiting CPU!!!  31474   31475   31476   31477   31478   31479
y E-u*q}sg0Waiting  IO    NONE
!e[`7I9qwM0456            State=WAITING;51Testing软件测试网1iUp8\;Pm
最后的一行就是下一句要执行的命令。我们现在在另一个函数上加断点。注意我们
4aTOx!GW7[0可以用l/list命令来显示原代码。这里我们键入
'Ml#s2wd;k%z~0(gdb)l
d!c b/m!F*X0Lf0451     main()
@:tuP1{p0452     {
S_8a;_Ts$z5t0453             int message;
S(Em~N+uN:S%y045451Testing软件测试网4O LD3p}*g
455            Initial();51Testing软件测试网!M(y2^oq_n
456            State=WAITING;51Testing软件测试网v~,I.{/uh6E*t
457            printf("Use Control-C to halt \n");51Testing软件测试网Zo"E,M|
458            signal(SIGALRM,AlarmMessage);
p4eH4L|y9R'E!dV0459            signal(SIGINT,InteruptMessage);51Testing软件测试网YB*l7^y6j2mx
460            signal(SIGUSR2,IoMessage);51Testing软件测试网.qiSN{1T#ToC`*g4H
(gdb) l
~i1n2N o!qt0461            alarm(TimeSlot);51Testing软件测试网}$]%yRp8g E2V
462            for(;;)
f!Api;E h-d:WmY._0463             {
7RL \/B"i'Bm3Kn0464             message=GetMessage();
b PW-Acy-w_(Y0465                   switch(message)51Testing软件测试网/WD/YC%I
466                     {51Testing软件测试网-Y,D,H!_qTm3q8@
467                             case INTERRUPT :        printf("Use Control-C t;51Testing软件测试网/I iAsC8v Bp)W7JU
 
)Q3`s:F7B V Q0468                                                     break;
7_;N pm,a0469                             case CHILD_IO:          WaitingIo();
_;l:V qW+_ U)}U0470                                                     break;
W4vN3i Q"Rt2v5}`0显示了原代码,现在在AlarmMessage上加断点。51Testing软件测试网i&C-VsRV8Y
(gdb) b AlarmMessage51Testing软件测试网F-x.[a3|@1B#Lf5V.u3Y
Breakpoint 2 at 0x8048ee3: file os.c, line 259.
F9j|'g6\%yyk0(gdb)
VOe#o4rp[0然后我们继续运行程序。
IOE|0pKW0(gdb)c51Testing软件测试网A7K;P*h9Gk n BGF9C
c或continue命令让我们继续被中断的程序。 显示:51Testing软件测试网&H{Qb|
Continuing.51Testing软件测试网~\D(t(hzu6rJ
Use Control-C to halt51Testing软件测试网N;BS{(CQ9A
 
4B'ftEuVUz.}0Breakpoint 2, AlarmMessage () at os.c:259
2y|"`{?!cs'Q*u l0259             ClearSignal();
5D??DR6C F0注意我们下一句语句就是ClearSignal();51Testing软件测试网m*^$~ I K e9F&kUU
我们用s/step跟踪进入这个函数看看它是干什么的。51Testing软件测试网 S1p)o:\s }r
(gdb) s51Testing软件测试网q%yBt-k&\
ClearSignal () at os.c:227
-{G*@ k B&kJa0227             signal(SIGINT,SIG_IGN);
gsol7g%DC'Fm0用l命令列出原代码:
E:s,S1lNT:_HT_0(gdb) l
e2M"F;HmI.H0222     }51Testing软件测试网/h$Z2A]"j l
22351Testing软件测试网7x"gR"^[ Hj
224
7VG)K9PR~0225     void ClearSignal()    /* Clear other signals */
P#JegU2t7q0226     {
"m n$~b-z6j0227             signal(SIGINT,SIG_IGN);51Testing软件测试网(J"})uO5XoM3i_ ~
228             signal(SIGALRM,SIG_IGN);51Testing软件测试网 ^;s.H3T jA:uT
229             signal(SIGUSR2,SIG_IGN);51Testing软件测试网k(EK1H/z c;O4z:y
230     }51Testing软件测试网l$q&D;X;hrP6?
231
[XT No2eW*w0(gdb)
)c&L;Z WL3A0我们可以用s命令继续跟踪。现在让我们来试试bt或backtrace命令。这个命令可以
/Z0y$Cj0g-tdi0显示栈中的内容。
S_b%^;BuVc)i;^5P0(gdb) bt
;J$G"D}s&^+C!^"bB4\ N0#0  ClearSignal () at os.c:227
;v,Xo.L X+Oj0#1  0x8048ee8 in AlarmMessage () at os.c:25951Testing软件测试网F A BW0[9bo D)c7_@O
#2  0xbffffaec in ?? ()51Testing软件测试网\\rE8A7c
#3  0x80486ae in ___crt_dummy__ ()51Testing软件测试网5~ c0t`6z?m
(gdb)51Testing软件测试网,d7]'cSR)Zx4~1a0g
大家一定能看懂显示的意思。栈顶是AlarmMessage,接下来的函数没有名字--就是
ZvD~T3w*x0没有原代码符号。这显示了函数调用的嵌套。51Testing软件测试网!_%x X _m
好了,我们跟踪了半天还没有检查过变量的值呢。检查表达式的值的命令是p或print51Testing软件测试网4N4x5T6vP(y&b_$bM
格式是p <表达式>
q u"[&c ?8y0444444让我们来找一个变量来看看。:-)51Testing软件测试网p7ZOeo'O2a c
(gdb)l 151Testing软件测试网-u(iF!Zb0x
还记得l的作用吗?l或list显示原代码符号,l或list加<行号>就显示从<行号>开始的
Y.g-M:\cq0原代码。好了找到一个让我们来看看WaitingQueue的内容51Testing软件测试网/W ^1z)BHQT
(gdb) p WaitingQueue
D1]Kh1j7N y~*x0$1 = {1, 2, 3, 4, 5, 6, 0}51Testing软件测试网8xZ*zoX TT-~2EU
(gdb)51Testing软件测试网Q#k{.e0U:zv
WaitingQueue是一个数组,gdb还支持结构的显示,
vt k p;[:es0(gdb) p Pcb51Testing软件测试网.k6eN*\ T`u
$2 = {{Pid = 0, State = 0, Prior = 0, pc = 0}, {Pid = 31474, State = 2,
'S_"D;UYiW0    Prior = 24, pc = 0}, {Pid = 31475, State = 2, Prior = 19, pc = 0}, {
}2z;b g't l@0    Pid = 31476, State = 2, Prior = 16, pc = 0}, {Pid = 31477, State = 2,51Testing软件测试网-H0Z OI2n W6L!j
    Prior = 23, pc = 0}, {Pid = 31478, State = 2, Prior = 22, pc = 0}, {51Testing软件测试网I B$kR${U)a!K6k~p
    Pid = 31479, State = 2, Prior = 20, pc = 0}}
iJ7n ^z5{cV1s0(gdb)
4]7E t+V.oiKV0这里可以对照原程序看看。51Testing软件测试网(kc ubw+b B8^
原文档里是一个调试过程,不过我想这里我已经把gdb的常用功能介绍了一遍,基本上51Testing软件测试网0o Rv"Ns v
可以用来调试程序了。:-)51Testing软件测试网{,p3s fY#W6v)y%Eo

"]9N6uc`$b"?0
b'U3r)OKh{1Cd(K0运行GDB(一些详细的说明):51Testing软件测试网 J{*Cb8gL |p
 
(c/S:mO*f0j XJ$Z0  前面已经提到过如何运行GDB了,现在让我们来看一些更有趣的东西。你可以在运行
@1v!iVR0k4B(t#A!hjh0GDB时通过许多命令行参数指定大量的参数和选项,通过这个你可以在一开始就设置好
/bHL A ig5c*r+S0程序运行的环境。51Testing软件测试网,st:ciI;L$J0g
  这里将要描述的命令行参数覆盖了大多数的情况,事实上在一定环境下有的并没有51Testing软件测试网:l*p#^;D}]
什么大用处。最通常的命令就是使用一个参数:51Testing软件测试网g,l3r4Om%hwf
 $gdb <可执行文档名>51Testing软件测试网0S{{6EM"\6ZNH8lyu
你还可以同时为你的执行文件指定一个core文件:51Testing软件测试网2UO8MI)x5Za7J
 $gdb <可执行文件名> core
^)m V%Og| _,Z0你也可以为你要执行的文件指定一个进程号:
^:Tz1Io0 $gdb <可执行文件名> <进程号> 如:&gdb os 1234将使gdb与进程1234相联系(attach)
j+O z#n;G\IP0除非你还有一个文件叫1234的。gdb首先检查一个core文件。
uBT*Z y8X.e4C0如果你是使用一个远程终端进行远程调试的话,那如果你的终端不支持的话,你将无法
4@l?)xV*{x0使用第二个参数甚至没有core dump。如果你觉得开头的提示信息比较碍眼的话,你可以
ak-qE3cA} V]5U0用gdb -silent。你还可以用命令行参数更加详细的控制GDB的行为。51Testing软件测试网4D^0Vo7qw
打入gdb -help或-h 可以得到这方面的提示。所有的参数都被按照排列的顺序传给gdb51Testing软件测试网4omA$la8[ ^
除非你用了-x参数。
-]$@1[W|0`8Zn j0  当gdb开始运行时,它把任何一个不带选项前缀的参数都当作为一个可执行文件或core51Testing软件测试网N~U8[Y9UX#z"B
文件(或进程号)。就象在前面加了-se或-c选项。gdb把第一个前面没有选项说明的参数51Testing软件测试网;h].afp.{
看作前面加了-se 选项,而第二个(如果有的话)看作是跟着-c选项后面的。
-^8o5J)Y S@v4a0  许多选项有缩写,用gdb -h可以看到。在gdb中你也可以任意的把选项名掐头去尾,只
)Dj)Wl)]{y0要保证gdb能判断唯一的一个参数就行。51Testing软件测试网*n'qKd6p
在这里我们说明一些最常用的参数选项
P4@kP phZz0-symbols <文件名>(-s <文件名>)------从<文件名>中读去符号。
wK2w'\+Yj/X)b#^0-exec <文件名>(-e <文件名>)----在合适的时候执行<文件名>来做用正确的数据与core
j%me!h h{L0 dump的作比较。51Testing软件测试网7V~$fa)\&W:^-P0c
-se <文件名>------从<文件名>中读取符号并把它作为可执行文件。51Testing软件测试网:Qi7d-h#P/[ B8Z
-core <文件名>(-c <文件名>)--指定<文件名>为一个core dump 文件。51Testing软件测试网4i/l0U(}xz
-c <数字>----连接到进程号为<数字>,与attach命令相似。51Testing软件测试网H}:k{h:C;w
-command <文件名>
tZO*]4O@0d0-x <文件名>-----执行gdb命令,在<文件名>指定的文件中存放着一序列的gdb命令,就51Testing软件测试网&?&iZ6Gan&[
象一个批处理。51Testing软件测试网+^[L'h!z o&zB{f
-directory(-d) <路径>---指定路径。把<路径>加入到搜索原文件的路径中。
;tOY#g T)`0-m
Fc5y!TG0-mapped----
~!T6B7_0{}^t8_0   注意这个命令不是在所有的系统上都能用。如果你可以通过mmap系统调用来获得内存51Testing软件测试网0lZr/}Z K9M
映象文件,你可以用这个命令来使gdb把你当前文件里的符号写入一个文件中,这个文件51Testing软件测试网,bK*YNSQ
将存放在你的当前路径中。如果你调试的程序叫/temp/fred那么map文件就叫
P.\ t{d]d [R0./fred.syms这样当你以后再调试这个程序时,gdb会认识到这个文件的存在,从而从这51Testing软件测试网_1f~6x%ZB-{*|'L
个文件中读取符号,而不是从可执行文件中读取。.syms与主机有关不能共享。51Testing软件测试网U)l&V9fu
-r51Testing软件测试网a%si5d?X8~J
-readnow---马上从符号文件中读取整个符号表,而不是使用缺省的。缺省的符号表是
E&JI;v1]!K8l0调入一部分符号,当需要时再读入一部分。这会使开始进入gdb慢一些,但可以加快以后51Testing软件测试网.VT!e?C&q
的调试速度。51Testing软件测试网i4GkRyB_y
 51Testing软件测试网 o$FK3\MiCh$Pv
 -m和-r一般在一起使用来建立.syms文件
c.yU)n^}](i$@6e.M0m0 
/\[*{(rCOa0 51Testing软件测试网gHS-R;^K
接下来再谈谈模式的设置(请听下回分解 :-))
lN8R4Z bfh;Q(pL0附:在gdb文档里使用的调试例子我找到了在minix下有这个程序,叫m4有兴趣的
L|y@#BPd:S4{;@0可以自己去看看51Testing软件测试网/|;w$M4Zm

51Testing软件测试网7St$z-kN@dh&^


?u2R[Xs.?0O2o8y8H3~$C0模式的选择
9X'_3t$^Kt)gW A"o0--------------51Testing软件测试网 `;G)xjwM T){
现在我们来聊聊gdb运行模式的选择。我们可以用许多模式来运行gdb,例如在“批模式”
,q6t o:Hr@^0或“安静模式”。这些模式都是在gdb运行时在命令行作为选项指定的。51Testing软件测试网*[0t#J kE0x5h PTk
`-nx'
~Ref~0`-n'
4\3|@ n2gc.^.Zh3H@&l0     不执行任何初始化文件中的命令。(一般初始化文件叫做`.gdbinit').一般情况下在
'lI;gy+c(FV)yW0这些文件中的命令会在所有的命令行参数都被传给gdb后执行。51Testing软件测试网&O2d?d'g:p U
 51Testing软件测试网$MH I!G(Gw{-I
`-quiet'51Testing软件测试网k Qa V&{I2k1Y
`-q'51Testing软件测试网6R'oS$j4nB([(H ~
     “安静模式”。不输出介绍和版权信息。这些信息在“批模式”中也被跳过。
@.UUi3c1?%U2i\0 51Testing软件测试网(M'sR5B&{%G'C
`-batch'51Testing软件测试网&z q9e]*Hz.ML
     “批模式”。在“批模式”下运行。当在命令文件中的所有命令都被成功的执行后51Testing软件测试网}V-ruR
     gdb返回状态“0”,如果在执行过程中出错,gdb返回一个非零值。51Testing软件测试网zk7XV c!Q,r
     “批模式”在把gdb作为一个过滤器运行时很有用。比如在一台远程计算机上下载
0y/[VV(x^v0     执行一个程序。信息“ Program exited normally”(一般是当运行的程序正常结束
6@%m+Sj,e K0f_0     时出现)不会在这种模式中出现。
6g7?L8Rc"` z;e#N0`-cd DIRECTORY'
{HVA}+I0     把DIRECTORY作为gdb的工作目录,而非当前目录(一般gdb缺省把当前目录作为工作目
PQn HH!p;s'u2N0     录)。51Testing软件测试网6GKA3Cj#G{
`-fullname'
W.CbCFzQJ1xz5a0`-f'
*JtSpvb-I7c-T0     GNU Emacs 设置这个选项,当我们在Emacs下,把gdb作为它的一个子进程来运行时,51Testing软件测试网d)c?E,xY~
     Emacs告诉gdb按标准输出完整的文件名和行号,一个可视的栈内容。这个格式跟在
1gpwv m,Vz i}Z/Yb0     文件名的后面。行号和字符重新按列排,Emacs-to-GDB界面使用\032字符作为一个
$]tw.ij T-vE4h;`]0     显示一页原文件的信号。
r!Y#E;BzN*fS0`-b BPS'
5r+X,M;C,hW0     为远程调试设置波特率。
W9T2BOs9gM {t0 51Testing软件测试网B$X%]pu^.M*A I
`-tty DEVICE'51Testing软件测试网fJ$vB%Yf2H
     使用DEVICE来作为你程序的标准输入输出。51Testing软件测试网2k"n,c7?)[C"o

51Testing软件测试网 _X#Roy(g:oS

 

y*|#~ n[ @dL6} `051Testing软件测试网#Ct#x wE b'~F

退出gdb51Testing软件测试网N7gt!T%o%_`
============51Testing软件测试网*Q"a8E-oj0ec[%t?oN
 51Testing软件测试网u3p.@~)u8w$M ~;S
`quit'51Testing软件测试网L6B1G+E~T'yz1U(no
     使用'quit'命令来退出gdb,或打一个文件结束符(通常是' CTROL-D')。如果
&{Vb"w Q4Vu Wl0     你没有使用表达式,gdb会正常退出,否则它会把表达式的至作为error code51Testing软件测试网DE,~!fSv8y d'w3S
     返回。51Testing软件测试网t+RkODt@:M"o
 
0O(s{;@}U}i$L0     一个中断(通常是'CTROL-c)不会导致从gdb中退出,而是结束任何一个gdb的命
C#p vb@\Lh4N(m0     令,返回gdb的命令输入模式。一般在任何时候使用'CTROL-C'是安全的,因为
L+gf@lp"h0     gdb会截获它,只有当安全时,中断才会起作用。
dc_I+W0q6_7\ F gW0     如果你正在用gdb控制一个被连接的进程或设备,你可以用'detach'命令来释放
,J~z%ts:B-^+_0     它。
(v1b?OrKARXR6h9|0 51Testing软件测试网-F$\@,^ ]
Shell命令
2Y|_%xxiVz0==============
CX2l%T6J0    当你偶尔要运行一些shell命令时,你不必退出调试过程,也不需要挂起它;你
O6S5m+\r0    可以使用'shell'命令。
.CiS `d AB0 
6H*~^3]J;ik0`shell COMMAND STRING'51Testing软件测试网Z+E aue9Z+wBK
     调用标准shell来执行'COMMAND STRING'.环境变量'SHELL'决定了那个shell被51Testing软件测试网dh U7Y0?-tl8gGT
     运行。否则gdb使用'/bin/sh'.51Testing软件测试网6jI4V~!n$X
     'make'工具经常在开发环境中使用,所以你可以不用'shell'命令而直接打'make'
o.[1i~y'c6~!vp-x0 
Ee\2N\{&w0`make MAKE-ARGS'
j C|&W1k8z[/M0     用指定的命令行变量来运行'make'程序,这等于使用'shell make MAKE-ARGS'
3g*P%U[if| q(Az&{0GDB 命令
v9[-nm]9~:Z z0************51Testing软件测试网9_ V^JR\ c
   我们可以把一个gdb命令缩写成开头几个字母,如果这没有二意性你可以直接回车来
*a V]}s5W$[0   运行。你还可以使用TAB键让gdb给你完成接下来的键入,或向你显示可选择的命令,51Testing软件测试网alLK n+D5S
   如果有不止一个选择的话。
%\4}(z~"{c@.^D U0 51Testing软件测试网 mLwjCTd$v
Command语法51Testing软件测试网hHcN$a%z@$D
==============
(`C])t7~| C7Ci0 
:y"D n {g/h3l0   一个gdb命令是一个单行的输入。长度没有限制。它一个命令开头,后面可以跟参量。
9f*O-n'\,rc[0   比如命令'step'接受一个参量表示单步执行多少步。你也可以不用参量。有的命令51Testing软件测试网2Aq:|:W~m[`e
   不接受任何参量。51Testing软件测试网F!pKz8I
 51Testing软件测试网7ME COk~.U
   gdb命令只要没有二意性的话就可以被缩写。另外一些缩写作为一个命令列出。在某些
o6vkf7j"Y _%Q0   情况下二意也是允许的。比如's'是指定'step'的缩写,但还有命令'start'。你可以把51Testing软件测试网9a%h,k7mAV*[e
   这些缩写作为'help'命令的参量来测试它们。
^q]{t6RyIXu'f;t0   空行(直接回车)表示重复上一个命令。但有些命令不能重复比如象'run',就不会以这51Testing软件测试网!OV8M6W9WaQ
   种方式重复,另外一些当不小心重复会产生严重后果的命令也不能用这种方法重复。
o2G/u}:c@ M0   'list'和'x'命令当你简单的打回车时,会建立新的变量,而不是简单的重复上一个命51Testing软件测试网v6P lE/x q
   令。这样你可以方便的浏览原代码和内存。
p r3zC&N `/`0   gdb还有一种解释RET的方法:分割长输出。这种方法就和'more'命令相似。由于这时经
&mI^QLe0   常会不小心多打回车,gdb将禁止重复当一个命令产生很长的输出时。
^A;G3d'Ge2f{4tf0   任何用'#'开头一直到行尾的命令行被看作是注释。主要在命令文件中使用。
'p/j6jQ!x4V3N0 

/l]0ic K0D051Testing软件测试网 N:y e.~3}l@)Q

 51Testing软件测试网3nJ@?4cQjV[!Zgq

51Testing软件测试网+nL D)j/B yC

输入命令的技巧51Testing软件测试网XD m.vy9m6{}
==================
jf(dn%D$U `@0   前面已经提到过TAB键的使用。使用TAB键能让你方便的得到所要的命令。比如
9pK~}@6x0在gdb中:
1]d)}7y[8{Nn\0   (gdb)info bre <TAB>(键入info bre,后按TAB键)51Testing软件测试网1j g5w&R,e7u&u
   gdb能为你完成剩下的输入。它还能萎蔫提供选择的可能性。如果有两个以上可51Testing软件测试网u@,k8]&c EA
能的话,第一次按<TAB>键,gdb会响铃提示,第二次则显示可能的选择。同样gdb
{ H9ifOR*|8FO%SX0也可以为一些子命令提供快速的访问。用法与上相同。51Testing软件测试网 XiqK:`hQ
  上例中显示51Testing软件测试网iE,\5?+U qr}
   (gdb)info breakepoints51Testing软件测试网P0_Y Urx2K$P/_
   你也可以直接打回车,gdb就将你输入的作为命令的可能的缩写。来判断执行。51Testing软件测试网5W(t LL KU b6v)a[
如果你打入的缩写不足以判断,那么gdb会显示一个列表,列出可能的命令。同样的
(L6gru7rG(c$b0情况对于命令的参数。在显示完后gdb把你的输入拷贝到当前行以便让你继续输入。51Testing软件测试网.K4w5L@G3d#H8N
   如果你只想看看命令的列表或选项,你可以在命令行下打M-?(就是按着ESC键
TDI9E"FD$N9Ns0同时按SHIFT和?键)。你可以直接在命令行下打试试。
m4JSh0y.l.I0  (gdb)<M-?>51Testing软件测试网Jxzu#a/zo#k
   gdb会响铃并显示所有的命令。不过这种方式好象在远程调试是不行。当有的命令51Testing软件测试网7PzJ _'M9|y$WG{
使用一个字符串时,你可以用" ' "将其括起来。这种方法在调试C++程序时特别有用。51Testing软件测试网h.q'fS&p+M Co
因为C++支持函数的重载。当你要在某个有重载函数上设断点时,不得不给出函数参数51Testing软件测试网(i[ H!hY8N%dH
以区分不同的重载函数。这时你就应该把整个函数用" ' "括起来。比如,你要在一个
E$v&H&N"c7O sg_}0叫name的函数上设断点,而这个函数被重载了(name(int)和name(float))。你将不得
s:D&} N6c \0`|0不给出参变量以区分不同的函数。使用'name(int)'和'name(float)'。这里有个技巧,
N@B4Iy gN]0你可以在函数名前加一个" ' "符号。然后打M-?.
0W,~3W~e:q_&A$H0 

2f/[GxS}0

t;oS0~U }.T#^%u0 51Testing软件测试网z v$s_U(fS-O

51Testing软件测试网9^I&]$B+J(x

东西太多了,翻起来好费时间,只好慢慢的贴了。//shy
3z,V/Z-i K&U5YH2[ q_0如果有人愿意一起做这件事的话请回信到我信箱。51Testing软件测试网*n+~0M1G.i4s
 51Testing软件测试网3dTZ L!k ^
得到帮助
4p/H!h'vYK|0============
~\~rY,V(X$B0   你可以使用help命令来得到gdb的在线帮助。51Testing软件测试网-i7{v6F.V;cq ed
 
2Rn;vZN ~h0`help'
@v z]2toH0`h'51Testing软件测试网6H+D)G7NN+q!t#h:xJ
      你可以使用help或h后面不加任何参数来得到一个gdb命令类的列表。
4jV4p*{6}l!|0 
P#x ^;[5Zw p"n0          (gdb) help51Testing软件测试网 ?'Z(?)U2V8V
          List of classes of commands:51Testing软件测试网'|:qV\4T1zt5M
 
:Yby$D(`y;_[:g{(U0          running -- Running the program
o{K,LG4o#Q0          stack -- Examining the stack51Testing软件测试网+sp)CL`F
          data -- Examining data
Z BF5Z;X:Q8wp-{0          breakpoints -- Making program stop at certain points
't SOJW0          files -- Specifying and examining files
eADpR*n!S1[0          status -- Status inquiries51Testing软件测试网7Zq y:~5h"b)e5A
          support -- Support facilities51Testing软件测试网)Q"f+u[1_,McG bH
          user-defined -- User-defined commands
)x0dA3@Wm)r pz2Q0          aliases -- Aliases of other commands
_0@8gBT/B7^s0          obscure -- Obscure features
Phm.@*^3nD;S0 
Y-v-JN%F0          Type "help" followed by a class name for a list of51Testing软件测试网P,E,O nC_6FVIK
          commands in that class.51Testing软件测试网R9w^I+r
          Type "help" followed by command name for full51Testing软件测试网 P.HI:Q3^)GN&P
          documentation.
:g8l'k+X6bj@0          Command name abbreviations are allowed if unambiguous.51Testing软件测试网v5g"H y Lrt*}
          (gdb)51Testing软件测试网L[a,xaRT,X
 51Testing软件测试网 \'O.TF9u:k3w~J
`help CLASS'51Testing软件测试网Y(VxF3a jo6J
     使用上面列出的help class作为help或h的参量,你可以得到单一的命令列表。
[VI;mCz#{0     例如显示一个'status'类的列表。
S(E y*t'k3]4z0 
?6vi e b W)?zp&fz.L0          (gdb) help status
(H#~d^xm0          Status inquiries.
1x)Ot$Dfw;Y"P1C#|:K0 
sR+} P(k/B9S0          List of commands:51Testing软件测试网6dL|A0BP/_g){#r
 
h#mI ` |}$ezV0          show -- Generic command for showing things set51Testing软件测试网 j|V TZ ^@
           with "set"
|)g0Wq\AO;h3U4S0          info -- Generic command for printing status51Testing软件测试网 GUrzbJ
 
&m!iHQUS0          Type "help" followed by command name for full51Testing软件测试网!x,c^2eR]Q2X^E
          documentation.
R/f"@Dz2n0          Command name abbreviations are allowed if unambiguous.
(Eh\ZrW1r0          (gdb)51Testing软件测试网{ Er?4JwA
 
0ReZ a ]Xs0`help COMMAND'51Testing软件测试网.EV2D2C$zj
     详细列出单个命令的资料。51Testing软件测试网2dxBK,}2y8N
 51Testing软件测试网:A-c} lOq;K!kil
`complete ARGS'51Testing软件测试网Y1s^L$t"A
     列出所有以ARGS开头的命令。例如:
fz,b/r\*?(@%J0 51Testing软件测试网q gCRrNb&T
          complete i51Testing软件测试网;}] W!U2z2w
 
(QU cIG wl0     results in:
MB)ju%}k&pOa)m0 51Testing软件测试网-y9U8`-S6`W^%A*N
          info
R(c?yt0          inspect
%eL'sH'?vUgb3n+m0          ignore
"anF!y9]Dj.A,N:{*B0 
cd+lH4y0     This is intended for use by GNU Emacs.
%x0}A(nop-{H0 
qAis7P V$O0   除了使用'help'你还可以使用gdb的命令'info'和'show'来查询你程序的51Testing软件测试网7`;y_eOU
状态,每个命令可以查询一系列的状态。这些命令以恰当的方式显示所有的51Testing软件测试网&hfMr n:yB
子命令。
1Qo%j-j9WP0 51Testing软件测试网Le:O'o!cYW9W
`info'
5}1sT2DN.T0     此命令(可以缩写为'i')用来显示你程序的状态。比如,你可以使用info
9P6R~ N&g.g0args 列出你程序所接受的命令行参数。使用info registers列出寄存器的状态。
KP3x GE{0Vm'H'eQ0或用info breakpoint列出在程序中设的断点。要获得详细的关于info的信息打
5QoA&CU8W {/f@{ B0help info.51Testing软件测试网:L1i+t1u*kB
`set'51Testing软件测试网5m$M.f{e7?SB
     这个命令用来为你的程序设置一个运行环境(使用一个表达式)。比如你51Testing软件测试网2q~~~Fyh
可以用set prompt $来把gdb的提示符设为$.51Testing软件测试网0{3~PZ:F]#A4L O
 51Testing软件测试网#\3e%b^1lV
`show'
'J-O |&z@ af)f Oc0     与'info'相反,'show'命令用来显示gdb自身的状态。你使用'set'命令来
_ED,XnDK0可以改变绝大多数由'show'显示的信息。比如使用show radix命令来显示基数。51Testing软件测试网+B,W9` s`(R.D9m J
用不带任何参变量的'set'命令你可以显示所有你可以设置的变量的值。
/d.J5Jj9PeS,l0有三个变量是不可以用'set'命令来设置的。
'i Vv4G6SP#u)^F |0`show version'51Testing软件测试网2Y/mPZ g
     显示gdb的版本号。如果你发现gdb有bug的话你应该在bug-reports里加
P0O ]Zl#PHSZ0入gdb的版本号。
.IQAk4X y;TP~0 
m/`![*tK!X dF7Y%d)M0`show copying'51Testing软件测试网v h+Y Jq3pQ;U
显示版权信息。
9KqEE:[a0 
9o e&W X$@XU*e MT0`show warranty'
$N} TQ3eK1i6v.\#r;o0显示担保信息。51Testing软件测试网2Yk n+u O0{!g1P6b
在gdb下运行你的程序
#g{p0q3]S0**************************51Testing软件测试网"hee4h7R^ A7M
   当你在gdb下运行程序时,你必须先为gdb准备好带有调试信息的可执行文档。
._'B;i0Ff.o*j0S._:i9j0还可以在gdb中为你的程序设置参变量,重定向你程序的输入/输出,设置环境变51Testing软件测试网 E bj0P |]6l4t f
量,调试一个已经执行的程序或kill掉一个子进程。
5fg5le)Eq0   这里许多内容在早先的例子中都已经用到过,可以参见gdb(二)。51Testing软件测试网 ?&sR2B yp3L
目录:51Testing软件测试网)kJA3]?O
 51Testing软件测试网}?C*y/s H y5tf
* 编译::                        为调试编译带调试信息的代码51Testing软件测试网6m5HAp1A3mu
* 运行::                        运行你的程序51Testing软件测试网$pkDv,u(c*e7q
* 参变量::                      为你的程序设置参变量51Testing软件测试网+w)IkR:T%t#Crr
* 运行环境::                    为你的程序设置运行时环境51Testing软件测试网2u4x.{+e {SY!g*q
* 设置工作目录::                在gdb中设置程序的工作目录。
S`4dA2P$pt~ I0* 输入/输出::                   设定你程序的输入和输出51Testing软件测试网N~'oZW)j
* 连接::                        调试一个已经运行的程序51Testing软件测试网&u G^jZ%X)C[X
* 结束子进程::                  Kill子进程
J_&hf u/`9U&T8}5t#b0* 进程信息::                    附加的进程信息
C)u7p%Ef|0* 线程::                        调试带多线程的程序
D1bc|yeX ]0* 多进程::                   调试带多进程的程序51Testing软件测试网G!?eN }"r-R c
为调试准备带调试信息的代码
7j v#J u x8o0===========================
)y'K9ua1K[0   为了高效的调试一个程序,你需要使用编译器来产生附带调试信息的可执行代码51Testing软件测试网G8TO%j ^
这些调试信息存储在目标文件中;描述了变量数据类型和函数声明,在原文件代码行
L3L2R!G#Sg0和执行代码之间建立联系。51Testing软件测试网4AI6d Bm]
   为产生调试信息,当你使用编译器时指定'-g'选项,就可以为你的程序产生带有51Testing软件测试网1C2PU d~:T$Hb1\
调试信息的可执行代码。
:o;g @7}+Ay8Z}^u0   有些c编译器不支持'-g'选项和'-O'选项,那你就有麻烦了,或者有别的方法产生
8JLx3p-rUQo0带调试信息的可执行代码,要不就没办法了。51Testing软件测试网l"d%z[ g [pL
   gcc,GNU的c语言编译器支持'-g'和'-O'选项。这样你就可以产生带调试信息的且51Testing软件测试网'Z,l7F}TsZ#bZ
优化过的可执行代码.
`'M4fJ|a R0   当你使用gdb来调试一个使用'-g','-O'选项产生的程序时,千万记住编译器为了优51Testing软件测试网]yh6BtP
化你的程序重新安排了你的程序。不要为运行次序与你原来设想的不同,最简单的例子51Testing软件测试网 YM'n jP.N.c+g
就是当你定义了一个变量但从未使用过它时,gdb中是看不到这个变量的--因为它已经51Testing软件测试网FX b4as:d8Py"Bu9i
被优化掉了。51Testing软件测试网kIvj/O(W&~"n
   所以有时你不要使用'-O'选项,如果当你不用优化时产生的程序是正确的,而优化51Testing软件测试网P.h)r oT'@-Q~
过后变的不正确了,那么这是编译器的bug你可以向开发者提供bug-reports(包括出错
_3DIx&}7b/E'v.]$b0的例子)。51Testing软件测试网IE?c2nq,a/NR0B
   早期的GUN C语言编译器允许'-gg'选项,也用来产生调试信息,gdb不再支持这种格
*c5n!QX0i]k#H;\0式的调试信息,如果你的编译器支持'-gg'选项,请不要使用它。
5d~0@ S] Q%Ry0 51Testing软件测试网"c.IpP U W'F

51Testing软件测试网V3] N$w FU5oRej-A

 

Hi+Fl9P|P051Testing软件测试网&Xk4@NLi"f _ A1W


+D.XL*vA Y7J6sD0开运行你的程序
|?%Xt g/gAR6X0=====================
$R9sCCaot-t0 51Testing软件测试网E|H/a| K)W
`run'
v9[g'L)Z0`r'
.z6E+N#PZ [.M0O.E0     使用'run'命令在gdb下启动你的程序。你必须先指定你程序的名字(用gdb的命令行
adL7^WMD0参数)或使用'file'命令,来指定文件名。如果你在一个支持多进程的环境下运行你的程51Testing软件测试网8H+e/rAo;} ?NH
序'run'命令创建一个子进程然后加载你的程序。如果环境不支持进程,则gdb直接调到51Testing软件测试网:k,qA)|;s
程序的第一条命令。51Testing软件测试网:v!a_T!y5YY6^7N
   一些父进程设置的参量可以决定程序的运行。gdb提供了指定参量的途径,但你必须51Testing软件测试网l@nFm:|
在程序执行前设置好他们。你也可以在运行过程中改变它们,但每次改变只有在下一次51Testing软件测试网w!ZC`&Bz
运行中才会体现出来。这些参量可以分为四类:
oSf(l bi5z0---参数
dV@D ke?.zX0     你可以在使用'run'命令时设置,如果shell支持的话,你还可以使用通配符,或51Testing软件测试网7[1UUP!~6lQHf
变量代换。在UNIX系统中你可以使用'shell环境变量'来控制shell。
t\z @CR(pZx3S0---环境:51Testing软件测试网2} C]o6gC-k
     你的程序一般直接从gdb那里继承环境变量。但是你可以使用'set environment'51Testing软件测试网(U5a X9Ds n
命令来设置专门的环境变量。51Testing软件测试网$[,mi%^#Y0GD7A`
---工作目录51Testing软件测试网'H4A#u4k#ViK(^
     你的程序还同时从gdb那里继承了工作目录,你可以使用'cd'命令在gdb中改变工作
7H;l V)J]/H@0目录。51Testing软件测试网K `&p+J4W X,| n v
---标准输入/输出51Testing软件测试网;~OHUA1q1s7l
     你的程序一般使用与gdb所用的相似的设备来输入/输出。不过你可以为你的程序的51Testing软件测试网CGR`ibka3[
输入/输出进行重定向。使用'run'或'tty'命令来设置于gdb所用不同的设备。51Testing软件测试网H}R0a1Yk
*注意:当你使用输入/输出重定向时,你将不能使用无名管道来把你所调试的程序的输出51Testing软件测试网kUeA qo {
传给另一个程序。这样gdb会认为调试程序出错。
zd4Mr\0   当你发出'run'命令后,你的程序就开始运行。51Testing软件测试网H }f'L7F M
   如果你的符号文件的时间与gdb上一次读入的不同,gdb会废弃原来的符号表并重新读51Testing软件测试网pi&u*IV@
入。当前的断点不变。
x$t@+M9\0}z/u0 

7v$K8F3C@2ix(}051Testing软件测试网b9N0V$S2T,Y+]

 51Testing软件测试网#U$Ar)u _|(Y-P

51Testing软件测试网 e+{ c8~%}~U8zt%d

程序环境
IG3G#R1J4]t j0==========================51Testing软件测试网6RFF?4Px0G
   “环境”包括了一系列的环境变量和它们的值。环境变量一般记录了一些常用的信息,
;}UPK&q |0比如你的用户名,主目录,你的终端型号和你的运行程序的搜索路径。一般你可以在shell51Testing软件测试网A[*BA Q$M%v
下设置环境变量,然后这些变量被所有你所运行的程序所共享。在调试中,可以设置恰当
N#LGxT@3x'Gd+|| }0的环境变量而不用退出gdb.
P,Z$s7^rR [0 51Testing软件测试网y vq _9oj8^&H Q
`path DIRECTORY'
)}7q,S E-J}d0     在'PATH'环境变量前加入新的内容('PATH'提供了搜索执行文件的路径)。对于gdb和51Testing软件测试网x[/i5k1Ie.F
你的程序来说你也许要设置一些专门的路径。使用':'或空格来分隔。如果DIRECTORY已经51Testing软件测试网o]Z1AN
在路径中了,这个操作将会把它移到前面。51Testing软件测试网+z @ im+F-H'M5i
     你可以使用串'$cmd'来代表当前路径,如果你用'.'的话,它代表你使用'path'命令
t%Ge.GjR l;[&S0时的路径,gdb将在把DIRECTORY加入搜索路径前用'.'代替当前路径
X2t%P0Km-k1B I(l0 
4a(t5V8oT1yRZ$hJ"m0`show paths'51Testing软件测试网U-]AKu
     显示当前路径变量的设置情况。51Testing软件测试网7x*V3KK-~C
 
F-M N&],ud0`show environment [VARNAME]'51Testing软件测试网A;?-`-X,|
     显示某个环境变量的值。如果你不指明变量名,则gdb会显示所有的变量名和它们的
l@6su(zte$az0内容。environment可以被缩写成'env'51Testing软件测试网!R,}!Af] ]
 51Testing软件测试网(d ia!So1xO
`set environment VARNAME [=] VALUE'51Testing软件测试网k#KP"^+I3\GV
     设置某个环境变量的值。不过只对你所调试的程序有效。对gdb本身是不起作用的。51Testing软件测试网7gk2i,H(M4wG;\R
值可以是任何串。如果未指定值,则该变量值将被设为NULL.51Testing软件测试网5r5Ak [hC(LQ E\
看一个例子:
v*G;d-d/kj-g*|0          set env USER = foo51Testing软件测试网 B`#L.J)FLI
     告诉一个linux程序,当它下一次运行是用户名将是'foo'51Testing软件测试网 ]%o ji`j9J+{6z3^
 
yX"i.d8HN2y9x0`unset environment VARNAME'51Testing软件测试网4YU0m0|[:t
     删除某环境变量。51Testing软件测试网N]I*m&v-E
 
]bS3l`0\0   注意:gdb使用'shell'环境变量所指定的shell来运行你的程序。
(hhMct P0 51Testing软件测试网Br(V'VC8He

51Testing软件测试网?O/N0J`5N?F

 51Testing软件测试网.x-R*s|w.W"{`lB%w0kw

Q3~B8mG d(nJ F0X:wwc0工作路径
"o/|!Dlsh0================================
5Z:h2A'dcT0   当你每次用'run'命令来运行你的程序时,你的程序将继承gdb的
#??~?s5m0当前工作目录。而gdb的工作目录是从它的父进程继承而来的(一般是51Testing软件测试网8D9^rP no&Is:uGx
shell)。但你可以自己使用'cd'命令指定工作目录。
cG!Xt,t5tLI)LvL8d0   gdb的工作目录就是它去寻找某些文件或信息的途径。
Jm)r? V w,G#r0`cd DIRECTORY'51Testing软件测试网pCr(RO;n v'Cn
     把gdb的工作目录设为DIRECTORY51Testing软件测试网6\0]&h5hkw ]
`pwd'
9l_o:F%ml-[0     打印输出当前目录。
#S.hkU4D0你程序的输入/输出51Testing软件测试网 bE~ hTH ZV{C
===============================51Testing软件测试网{ {Eg)ti0D
   缺省时,你的程序的输入/输出和gdb的输入/输出使用同一个终端。
Ns.@s2i'b0gdb在它自己和你的程序之间切换来和你交互,但这会引起混乱。51Testing软件测试网(l}Qj$i
`info terminal'51Testing软件测试网(SbAP LQ4u'{6a
     显示你当前所使用的终端的类型信息。
r6t9n%cp0     你可以把你程序的输入/输出重定向。51Testing软件测试网#n;UaYA N
例如:51Testing软件测试网3{ e{4NZ)zBU)Z M
     run > outfile51Testing软件测试网yL.ged[
运行你的程序并把你程序的标准输出写入文件outfile中。51Testing软件测试网8p5W J^0EV3T
   另一个为你程序指定输入/输出的方法是使用'tty'命令,这个命令
^P(hw&Oa r0接受一个文件名作为参量把这个文件作为以后使用'run'命令的缺省命
%| M5I{1qi0令文件。它还重新为子进程设置控制终端。
bUkU$q7}2j-kn0例如:51Testing软件测试网2U"]H6nt'@E,Y/W
     tty /dev/ttyb51Testing软件测试网A3u8GG$G7r1s
指定以后用'run'命令启动的进程使用终端'/dev/ttyb'作为程序的输入51Testing软件测试网Z*T o e8F-P1p as@
/输出,而且把这个终端设为你进程的控制终端。
$K2PX5Y$S0   一个清楚的使用'run'命令的重定向将重新设置'tty'所设置的内容
/a!Cfj iuv0,但不影响控制终端。   当你使用'tty'命令或在'run'命令中对输入51Testing软件测试网Yr3y(V2d-P}7[
/输出进行重定向时,只有你当前调试的程序的输入/输出被改变了,51Testing软件测试网9L8yS\ }R9v'F1s7K
并不会影响到别的程序。51Testing软件测试网E@9i1Z5I{
调试一个已经运行的程序:
"S(n-K r*S|B N0====================================51Testing软件测试网[+o)G2R{nE~
 51Testing软件测试网R)O4{,y&Y
`attach PROCESS-ID'
H,O x8ts&a#W0     这个命令把一个已经运行的进程(在gdb外启动)连接入gdb,以便51Testing软件测试网Na C0KCk"@_z
调试。PROCESS-ID是进程号。(UNIX中使用'ps'或'jobs -l'来查看进程)
g,hh!~7Y"bi0     'attach'一般不重复。(当你打了一个以上的回车时)51Testing软件测试网l[ D^Y2N6P X
   当然要使用'attach'命令的话,你的操作系统环境必须支持进程。
/o l i Y:Ys6v$d8o~0另外你还要有向此进程发信号的权力。51Testing软件测试网S{9f f/`0ti*l I
   当使用'attach'命令时,你应该先使用'file'命令来指定进程所51Testing软件测试网-^"X8dOSmYi
联系的程序源代码和符号表。   当gdb接到'attach'命令后第一件51Testing软件测试网,b[z)}B8RG
事就是停止进程的运行,你可以使用所有gdb的命令来调试一个“连接”51Testing软件测试网2?PNURH"l"f
的进程,就象你用'run'命令在gdb中启动它一样。如果你要进程继续运
"[(["Fo"X E0行,使用'continue'或'c'命令就行了。
+]a(VX ?%[0`detach'
ee Mtkk0   当你结束调试后可以使用此命令来断开进程和gdb的连接。(解除gdb51Testing软件测试网-Tef$\6}y?
对它的控制)在这个命令执行后进程将继续执行。
#Y%v;|;`(Z0   如果你在用'attach'连接一个进程后退出了gdb,或使用'run'命令执51Testing软件测试网V&p)`^{9pa
行了另一个进程,这个被'attach'的进程将被kill掉。但缺省时,gdb会
-dQPp2E,V:Y&M0要求你确认你是否要退出或执行一个新的进程。
md$^'kY_)H|0 

4xcba$g E^$l/l4t0

C f9BM_4T0 51Testing软件测试网Yb1~)TM5r7_T4v

'qF*W^5JM E9H0结束子进程51Testing软件测试网z ]EO0M
=========================
9\j8MzQGNR0`kill'51Testing软件测试网4s9wsRe1Ub T
     Kill命令结束你程序在gdb下开的子进程
PvuM Avo&S C3a0     这个命令当你想要调试(检查)一个core dump文件时更有用。gdb在调试过程中51Testing软件测试网){c [aX h6c'f Q
会忽略所有的core dump。
8arj'Kx0   在一些操作系统上,一个程序当你在上面加了断点以后就不能离开gdb独立运行。
I]Quj5Vp0你可以用kill命令来解决这个问题。
`U O(]+b}yI0   'kill'命令当你想重新编译和连接你的程序时也很有用。因为有些系统不允许修改51Testing软件测试网*|.G.} ` X6G%_
正在执行的可执行程序。这样当你再一次使用'run'命令时gdb会知道你的程序已经被改
H\ @i$J0变了,那么gdb会重新load新的符号。(而且尽量保持你当前的断点设置。
{tx1O!xU v0附加的进程信息51Testing软件测试网 D,CF R7c[)Y4Z n4o
==============================51Testing软件测试网!q[BLQ*[
   一些操作系统提供了一个设备目录叫做'/proc'的,供检查进程映象。如果gdb被在这
A:y7x2e&Mml"`*oH0样的操作系统下运行,你可以使用命令'info proc'来查询进程的信息。('info proc'命
'n:Y.B"_}Ps}.F0令只在支持'procfs'的SVR4系统上有用。
Eta9U'yi q4^+B0`info proc'51Testing软件测试网_f{1N S2\
     显示进程的概要信息。51Testing软件测试网p4\"b `_&b.@,W7K
`info proc mappings'
p9j+CY5@ y B z0     报告你进程所能访问的地址范围。51Testing软件测试网$l\0Um_(bw0}
`info proc times'
\kWVM%k-O(e0     你进程和子进程的开始时间,用户时间(user CPU time),和系统CPU时间。51Testing软件测试网&IE(`GS@4`
`info proc id'
HHq9V$`o|0     报告有关进程id的信息。51Testing软件测试网-c}8K-_C Rb
`info proc status'
F B0@ QW1}g0@t&K0     报告你进程的一般状态信息。如果进程停止了。这个报告还包括停止的原因和收到的51Testing软件测试网 N U'o V R6y-I!h
信号。51Testing软件测试网6GW;H;{!R)Ay
`info proc all'51Testing软件测试网(Qq(iw!y
     显示上面这些命令返回的所有信息。51Testing软件测试网2lZH,gbP ~H-r
对多线程程序的调试
`9Y ^C|(ty3~r0========================================
.sq n*xy S+zi)y0   一些操作系统中,一个单独的程序可以有一个以上的线程在运行。线程和进程精确的定?nbsp;
6~D%g5LTW0?nbsp;
s0}!? v#X"q0 
)p)||H&Ad(p0?nbsp;
U1YU'Y%d9t.R0?nbsp;51Testing软件测试网;GSMPr/n M
有自己的寄存器,运行时堆栈或许还会有私有内存。
T$X HseY0   gdb提供了以下供调试多线程的进程的功能:
,eJ|nH v%_}0   * 自动通告新线程。51Testing软件测试网M u~O~*n.W
   * 'thread THREADNO',一个用来在线程之间切换的命令。
L9Ox5~C)V Yx0   * 'info threads',一个用来查询现存线程的命令。
~'Am @4bn0   * 'thread apply [THREADNO] [ALL] ARGS',一个用来向线程提供命令的命令。
8b3c7@,CU(Wq0   * 线程有关的断点设置。51Testing软件测试网G-{/NOq5q4A
   注意:这些特性不是在所有gdb版本都能使用,归根结底要看操作系统是否支持。
q3uA Y(EP y'[4U5A0   如果你的gdb不支持这些命令,会显示出错信息:
MXz,h\0          (gdb) info threads51Testing软件测试网(q/R:Fy2D V pU,X3z(Q
          (gdb) thread 1
C0\.`9B S0          Thread ID 1 not known.  Use the "info threads" command to
+H;Z9@#SZvreP0          see the IDs of currently known threads.51Testing软件测试网6y B4a~5c:p
   gdb的线程级调试功能允许你观察你程序运行中所有的线程,但无论什么时候
-kA bO(QH8K0gdb控制,总有一个“当前”线程。调试命令对“当前”进程起作用。
fnbfd#F0   一旦gdb发现了你程序中的一个新的线程,它会自动显示有关此线程的系统信51Testing软件测试网?8j1|*?$^;Bvu!R:?
息。比如:51Testing软件测试网xL6zux|
     [New process 35 thread 27]51Testing软件测试网a0Tm-hP4d3W;i
不过格式和操作系统有关。51Testing软件测试网.LlZ ]|:p
   为了调试的目的,gdb自己设置线程号。
g&y-C8C#iFMI%_0`info threads'51Testing软件测试网/p4~u.N Q%N$W7]o
     显示进程中所有的线程的概要信息。gdb按顺序显示:51Testing软件测试网9I!f VD-b CG8b s
       1.线程号(gdb设置)51Testing软件测试网)B/fuc&w#JRq }
       2.目标系统的线程标识。51Testing软件测试网)_1m m y$aW o;t
       3.此线程的当前堆栈。51Testing软件测试网sFi)L5JG
       一前面打'*'的线程表示是当前线程。51Testing软件测试网wg7qJ_~
     例如:51Testing软件测试网7C3I9oJ&Av$S
     (gdb) info threads51Testing软件测试网(f_,wA3D [jn
       3 process 35 thread 27  0x34e5 in sigpause ()
&l5Ey;p$@OnM3Y3S'\0       2 process 35 thread 23  0x34e5 in sigpause ()51Testing软件测试网5~Tf6AqiP.n
     * 1 process 35 thread 13  main (argc=1, argv=0x7ffffff8)51Testing软件测试网h!h-I zV U@
         at threadtest.c:68
v+Dt s&SkY8Yz0 

0\1f z1E8T/y c051Testing软件测试网{gP {}

 51Testing软件测试网8HIQ;U3zg1U

g(W:|:amu!T V*Aw0`thread THREADNO'
g,s!M:@0L7_Mx#p0     把线程号为THREADNO的线程设为当前线程。命令行参数THREADNO是gdb内定的
$G,Vs#nF2V4H#y0线程号。你可以用'info threads'命令来查看gdb内设置的线程号。gdb显示该线程
'p{9R)J{h"{:A0的系统定义的标识号和线程对应的堆栈。比如:
6K+@(qb2Y7HHs0 
f-|$Eq xyF0          (gdb) thread 251Testing软件测试网dma6m%_C
          [Switching to process 35 thread 23]51Testing软件测试网9Ut1{ h'^6T4__C
          0x34e5 in sigpause ()
.m _%Px5e |0     "Switching后的内容取决于你的操作系统对线程标识的定义。
c bW @;O,W0 51Testing软件测试网s h"X,LO4J:N5J
`thread apply [THREADNO] [ALL]  ARGS'51Testing软件测试网 }V4htQt:z4i8d
     此命令让你对一个以上的线程发出相同的命令"ARGS",[THREADNO]的含义同上。51Testing软件测试网 `_$]0u/I
如果你要向你进程中的所有的线程发出命令使用[ALL]选项。51Testing软件测试网AK&m\6`*wI
   无论gdb何时中断了你的程序(因为一个断点或是一个信号),它自动选择信号或
.l9o&[:i$h3{,d0断点发生的线程为当前线程。gdb将用一个格式为'[Switching to SYSTAG]'的消息
mZ~(l^K8V0来向你报告。51Testing软件测试网BYC,H O
   *参见:运行和停止多线程程序。
5PHdy,B-k2G \0   *参见:设置观察点
&C9@)x_B'bi K0 
{`jo,n0调试多进程的程序51Testing软件测试网(l(~u-o)a0y8w
==========================================51Testing软件测试网 D,?5z\"a&m$s?P
   gdb对调试使用'fork'系统调用产生新进程的程序没有很多支持。当一个程序开始
:Bw]4a]0一个新进程时,gdb将继续对父进程进行调试,子进程将不受影响的运行。如果你在子
&X!M k$P$v9Oq0进程可能会执行到的地方设了断点,那么子进程将收到'SIGTRAP'信号,如果子进程没
8A_L:j;_a0有对这个信号进行处理的话那么缺省的处理就是使子进程终止。
W bgl_*R0   然而,如果你要一定要调试子进程的话,这儿有一个不是很麻烦的折衷的办法。在51Testing软件测试网;b|,m%iN&WK2E
子进程被运行起来的开头几句语句前加上一个'sleep'命令。这在调试过程中并不会引51Testing软件测试网JY@]hLT h
起程序中很大的麻烦(不过你要自己注意例外的情况幺:-))。然后再使用'ps'命令列出51Testing软件测试网3r7a"L'Q}%kQ!QF
新开的子进程号,最后使用'attach'命令。这样就没有问题了。51Testing软件测试网s6UF M}oP
  关于这一段,本人觉得实际使用上并不全是这样。我在调试程中就试过,好象不一定51Testing软件测试网 b h*o F zrL(_,X
能起作用,要看gdb的版本和你所使用的操作系统了。
L0jS,?Nm`1P0 

M2C$RG\051Testing软件测试网S h+aN2x*W&G'F


{-v9Pv3sO5TT0停止和继续
5z)_&~[.vk:M0***********************
Qlw*]$rpk)KD0   调试器的基本功能就是让你能够在程序运行时在终止之前在某些条件下停止下来,然
Z vPH'Po G0后再继续运行,这样的话你就可以检查当你的程序出错时你的程序究竟做了些什么。51Testing软件测试网5vZK.] g?~D
   在gdb内部,你的程序会由于各种原因而暂时停止,比如一个信号,一个断点,或是
-yAC4B5D{!O ]L0由于你用了'step'命令。在程序停止的时候你就可以检查和改变变量的值,设置或去掉51Testing软件测试网f3xM!@4X{h
断点,然后继续你程序的运行。一般当程序停下来时gdb都会显示一些有关程序状态的信
nt V;w6g%X0息。比如象程序停止的原因,堆栈等等。如果你要了解更详细的信息,你可以使用'info51Testing软件测试网9v.O;x9y8A S4e
program'命令。另外,在任何时候你输入这条命令,gdb都会显示当前程序运行的状态信51Testing软件测试网)WK'\+ug-F_
息。
W E rdlA3Dc0 
/n*mRr} b0`info program'51Testing软件测试网.oYaAd ] SG9H
     显示有关你程序状态的信息:你的程序是在运行还是停止,是什么进程,为什么停
/H[,@o-J D0止。
9Kpk2k hurk0 
p rV1q%`&|T0断点,观察点和异常
%VqXZ EW0========================================
a+rNQOW:y W0   断点的作用是当你程序运行到断点时,无论它在做什么都会被停止下来。对于每个断点51Testing软件测试网 [W%\ TMtt-r1D
你都可以设置一些更高级的信息以决定断点在什么时候起作用。你可以使用'break’命令51Testing软件测试网gp g2q$Qsn
来在你的程序中设置断点,在前面的例子中我们已经提到过一些这个命令的使用方法了。51Testing软件测试网1` P0F\-l'y/V~
你可以在行上,函数上,甚至在确切的地址上设置断点。在含有异常处理的语言(比如象51Testing软件测试网8a"M1@$OA iT0vX
c++)中,你还可以在异常发生的地方设置断点。
"w HHn6F_,V0   在SunOS 4.x,SVR4和Alpha OSF/1的设置中,你还可以在共享库中设置断点。
#[8p/q6kD:J0   观察点是一种特殊的断点。它们在你程序中某个表达式的值发生变化时起作用。你必
x F/E3d#[&P D%bb0须使用另外一些命令来设置观察点。除了这个特性以外,你可以象对普通断点一样对观察51Testing软件测试网0gL| @N/e.r
点进行操作--使用和普通断点操作一样的命令来对观察点使能,使不能,删除。
5U;d:~} Y t`0   你可以安排当你程序被中断时显示的程序变量。51Testing软件测试网0tJE9p Nd;zHo
   当你在程序中设置断点或观察点时gdb为每个断点或观察点赋一个数值.在许多对断点
i/]U$ln0操作的命令中都要使用这个数值。
icL@nD0 51Testing软件测试网ZF j3Ar Rr

%?|&O:Yu BB0v0 

'{ T0L(j'u,j/L:O Y051Testing软件测试网3J*b&wmQ-hK

设置断点
K`'xb%tL0C2N^?0=============51Testing软件测试网:h)XZ;cGR
   使用'break'或简写成'b'来设置断点。gdb使用环境变量$bpnum来记录你最新设置的51Testing软件测试网L.@YW#Y9i/D
断点。
Tw \eS;kT8_0   你有不少方法来设置断点。
\^#d!enE*u0 
8DRw4~&Ka2z{0 51Testing软件测试网3Y#~4@1P%@I-Mm
`break FUNCTION'51Testing软件测试网3E:fd?8i8H3x@
     此命令用来在某个函数上设置断点。当你使用允许函数重载的语言比如C++时,有可51Testing软件测试网:HiVk~$N~ La`
能同时在几个重载的函数上设置了断点。51Testing软件测试网hy\KgX9@`
 
:@6wx?+`:xl0`break +OFFSET'
G9Lk_e#aF N,I0`break -OFFSET'
l4fy4]b C0     在当前程序运行到的前几行或后几行设置断点。OFFSET为行号。51Testing软件测试网.D)Zk e/i8u`k&c0V
 51Testing软件测试网pYg6C_6M8o.f i
`break LINENUM'
G!gau [`+T0     在行号为LINENUM的行上设置断点。程序在运行到此行之前停止。51Testing软件测试网kSAWRs;^-V
 51Testing软件测试网 s ^K+G:S
`break FILENAME:LINENUM'51Testing软件测试网kAyY_5n-G+L$lc E
     在文件名为FILENAME的原文件的第LINENUM行设置断点。
!j"|;Q5?$yN8U s#U9V6hO0 
,gSY.G v]0`break FILENAME:FUNCTION'
Q(ROR*zm0     在文件名为FILENAME的原文件的名为FUNCTION的函数上设置断点。51Testing软件测试网ODxaIA,r]
当你的多个文件中可能含有相同的函数名时必须给出文件名。51Testing软件测试网(v]&o9G){+?0GYSS
 51Testing软件测试网D(^+o)x#QP
`break *ADDRESS'51Testing软件测试网DL/@1Px
     在地址ADDRESS上设置断点,这个命令允许你在没有调试信息的程51Testing软件测试网sC P{3y]
序中设置断点。
kS+YFw Nh0N(X0`break'51Testing软件测试网I(A+yw![
     当'break'命令不包含任何参数时,'break'命令在当前执行到的程
zmDJ6f!O&J8oo0序运行栈中的下一条指令上设置一个断点。除了栈底以外,这个命令使51Testing软件测试网 }1U,X)c?
程序在一旦从当前函数返回时停止。相似的命令是'finish',但'finish'51Testing软件测试网EU5` h!N
并不设置断点。这一点在循环语句中很有用。
w@6l sPba"[Bd l0     gdb在恢复执行时,至少执行一条指令。
"| t7Z2sp9t H0 
O7pu`*S,Q`4{0`break ... if COND'51Testing软件测试网4t{p&w(UwL
     这个命令设置一个条件断点,条件由COND指定;在gdb每次执行到此51Testing软件测试网T"sxDE9X
断点时COND都被计算当COND的值为非零时,程序在断点处停止。这意味着51Testing软件测试网Td-?Y7`%T6NQ mDf
COND的值为真时程序停止。...可以为下面所说的一些参量。51Testing软件测试网ql6b^ b
 51Testing软件测试网(YwHIG$^Xo p"W
`tbreak ARGS'
_ \j"T Y7c"y7`;?0     设置断点为只有效一次。ARGS的使用同'break'中的参量的使用。51Testing软件测试网].bD UH*Vx
 
h.^VY8Bv6uwX8H~(W0J0`hbreak ARGS'51Testing软件测试网(p!\"@w:b1^ X0nZ(qJ
     设置一个由硬件支持的断点。ARGS同'break'命令,设置方法也和51Testing软件测试网5z8iV+hM I,VvPuK
'break'相同。但这种断点需要由硬件支持,所以不是所有的系统上这个
9@%{4fC2FK#~9H0命令都有效。这个命令的主要目的是用于对EPROM/ROM程序的调试。因为51Testing软件测试网,[pz2djN!n'N#Q
这条命令可以在不改变代码的情况下设置断点。这可以同SPARCLite DSU
b)`"aeN3Ae| Xxm0一起使用。当程序访问某些变量和代码时,DSU将设置“陷井”。注意:
uAlvS#a|0你只能一次使用一个断点,在新设置断点时,先删除原断点。51Testing软件测试网u{ dl?u
 51Testing软件测试网@|\Ul1k

7kRi.V~M051Testing软件测试网s6B R$J)T j
`thbreak ARGS'
mG]GD4b0B0     设置只有一次作用的硬件支持断点。ARGS用法同'hbreak'命令。这个命令51Testing软件测试网c$G{U[1['~;f^
和'tbreak'命令相似,它所设置的断点只起一次作用,然后就被自动的删除。这
zZ;y6l C$j]u0个命令所设置的断点需要有硬件支持。51Testing软件测试网{)f1M!Y&@
 
-m4_fC-f2NF0`rbreak REGEX'
"ydg%\\.sc/K0     在所有满足表达式REGEX的函数上设置断点。这个命令在所有相匹配的函数
s&{GHU#{/KRg0上设置无条件断点,当这个命令完成时显示所有被设置的断点信息。这个命令设51Testing软件测试网(fAW;{h
置的断点和'break'命令设置的没有什么不同。这样你可以象操作一般的断点一
6X*pGw(X-[;F(~K!{0样对这个命令设置的断点进行删除,使能,使不能等操作。当调试C++程序时这
jEJJ!x3Hk0个命令在重载函数上设置断点时非常有用。
l||Vv PW0|mL:b0 51Testing软件测试网@Kp'[_%N
`info breakpoints [N]'
5n%\(w+_UV#A0`info break [N]'
8}\,T0J y4ro0`info watchpoints [N]'51Testing软件测试网y]*uJLB n4L"I9^
     显示所有的断点和观察点的设置表,有下列一些列
*P2GqJI!~0 
w.GW+}T#E o2?#fj\0    *Breakpoint Numbers*----断点号
1Fo6S3@ ]z `a0    *Type*----断点类型(断点或是观察点)51Testing软件测试网8R*o0u3h V~l
    *Disposition*---显示断点的状态。51Testing软件测试网1Db^$y!w;p$V
 
Of5m#G1W,_0    *Enabled or Disabled*---使能或不使能。'y'表示使能,'n'表示不使能。51Testing软件测试网1]E]ySAN^8]J@0x
 51Testing软件测试网 O)G7n!i~8p(S
    *Address*----地址,断点在你程序中的地址(内存地址)51Testing软件测试网;Vt8D!kfD-N Y
    *What*---地址,断点在你程序中的行号。51Testing软件测试网 inZ{'Bb9RB
     如果断点是条件断点,此命令还显示断点所需要的条件。51Testing软件测试网-Z-^d B?2PF B7v4@%{
     带参数N的'info break'命令只显示由N指定的断点的信息。
/i)T{.v*A1y&`*C0     此命令还显示断点的运行信息(被执行过几次),这个功能在使用'ignore'
E RL&GuVK/x5r0命令时很有用。你可以'ignore'一个断点许多次。使用这个命令可以查看断点
.hl5]0|T#E2G0被执行了多少次。这样可以更快的找到错误。
n;XU2?7L1[5}0    gdb允许你在一个地方设置多个断点。但设置相同的断点无疑是弱智的。不过51Testing软件测试网q5[v0CY"U+J,E.z Q
你可以使用条件断点,这样就非常有用。
h vi@/Q#y0   gdb有时会自动在你的程序中加入断点。这主要是gdb自己的需要。比如为了正51Testing软件测试网a`{FOt+AD8p
确的处理C语言中的'longjmp'。这些内部断点都是负值,以'-1'开始。'info
c mAT(QU `@0breakpoints'不会显示它们。51Testing软件测试网y*ir5lc:~.ABn
   不过你可以使用命令’maint info breakpoints'来查看这些断点。51Testing软件测试网v'wcc?s[y7J~1k e?
 51Testing软件测试网+R/HLr#[(zlK
`maint info breakpoints'
_UpGnN.x0     使用格式和'info breakpoints'相同,显示所有的断点,无论是你设置的还是51Testing软件测试网i"uG!U,{$X$mH
gdb自动设置的。51Testing软件测试网T4kGKs{u@Lx
     以下列的含义:51Testing软件测试网)P7N$Oc8R h7Z
 51Testing软件测试网cq)KR$n}9]!WAB
    `breakpoint'51Testing软件测试网_i5w~}s/Vy
          断点,普通断点。51Testing软件测试网E6y `%e)xTy4@ D:ww
    `watchpoint'
Z@m2]"KN8Z0          普通观察点。51Testing软件测试网9T0Gq9m6v5x4G"BJ
 51Testing软件测试网M KH'wg0A*b
    `longjmp'51Testing软件测试网)it_ QN+q|
          内部断点,用于处理'longjmp'调用。51Testing软件测试网V K7U}M:y(tZ
 51Testing软件测试网/{K/e-Uk~I.e8C?
    `longjmp resume'51Testing软件测试网:S2F Gp UZ7z?
          内部断点,设置在'longjmp'调用的目标上。
}Wc*y B:D0 
{c#Ru\+EU8`#X0    `until'
n5f#Y-n ?1T6w0          'until'命令所使用的内部断点。
x8fiSd'C0 51Testing软件测试网L;RPVF D
    `finish'
t6vafM_$e0]0          'finish'命令所使用的内部断点。51Testing软件测试网c)V6t*Y:GFA
 

X)`Z+K+}R7Fh6Y0

s0j']WX+m#f0 

P jS-E#u gWMgj6}051Testing软件测试网9y,~M e#S0gRd

设置观察点
y)n?7{%BB-Gw@k0==============
6Mx2z3m7Q6O'h2tw`e0   你可以使用观察点来停止一个程序,当某个表达式的值改变时,观察点会将程序
fL]S.n+h"p0停止。而不需要先指定在某个地方设置一个断点。51Testing软件测试网X/m]~+~
   由于观察点的这个特性,使观察点的使用时开销比较大,但在捕捉错误时非常有
+l4x~1W QbBg*T&?*v0用。特别是你不知道你的程序什么地方出了问题时。
od6f^*H;T0 51Testing软件测试网m}E;L ^"H zT
`watch EXPR'
4Bp$W x'L F(\5t0     这个命令使用EXPR作为表达式设置一个观察点。GDB将把表达式加入到程序中
/G,`|PsR0并监视程序的运行,当表达式的值被改变时GDB就使程序停止。这个也可以被用在51Testing软件测试网 H:Xw)bl Ag*|n@
SPARClite DSU提供的新的自陷工具中。当程序存取某个地址或某条指令时(这个地
/o/yge` K0址在调试寄存器中指定),DSU将产生自陷。对于数据地址DSU支持'watch'命令,然而
OO&j)B p2s Bh d0硬件断点寄存器只能存储两个断点地址,而且断点的类型必须相同。就是两个51Testing软件测试网2A-K&qu+S3j"SA0V4I
'rwatch'型断点,或是两个'awatch'型断点。
*KPW&W i~0y0 51Testing软件测试网nhF \/@
`rwatch EXPR'51Testing软件测试网!Ul;FUxO
     设置一个观察点,当EXPR被程序读时,程序被暂停。
^ t R(q\;y0 51Testing软件测试网GQK0pb7MW7Y
`awatch EXPR'
Jr6O1@Lelt0     设置一个观察点,当EXPR被读出然后被写入时程序被暂停。这个命令和'awatch'
S JxH M%r'QZ0命令合用。
-J C?#AR.xw0 
f^Kt.`l Y(y'?8E0`info watchpoints'51Testing软件测试网+Q WM2_.z.@
     显示所设置的观察点的列表,和'info break'命令相似。51Testing软件测试网 b7M}6Z:WR,[,N4G!n
     *注意:*在多线程的程序中,观察点的作用很有限,GDB只能观察在一个线程中51Testing软件测试网%]kIqIKEc+wxj
的表达式的值如果你确信表达式只被当前线程所存取,那么使用观察点才有效。GDB51Testing软件测试网MwXb7PQ M?
不能注意一个非当前线程对表达式值的改变。51Testing软件测试网1X0F z R V2`}Y_
 
$[ c"n7dX9j0断点和异常
qq*O;`;z&t"X&w0==============
jG]4tZ3w\0   在一些语言中比如象GNU C++,实现了异常处理。你可以使用GDB来检查异常发生的
h%Q-a~Kh8M0原因。而且GDB还可以列出在某个点上异常处理的所有过程。
gp \SH vz0 
i$H.Z7q2O6WWj0`catch EXCEPTIONS'51Testing软件测试网4X(mf(x%fp
     你可以使用这个命令来在一个被激活的异常处理句柄中设置断点。EXCEPTIONS是
F#{1N8Q)x~4C4R+N0一个你要抓住的异常。
9l4R2d5`oL v ym y0     你一样可以使用'info catch'命令来列出活跃的异常处理句柄。
,]zSV;Q!c4s? y6@ p0     现在GDB中对于异常处理由以下情况不能处理。51Testing软件测试网:aWrP*u\$w
   * 如果你使用一个交互的函数,当函数运行结束时,GDB将象普通情况一样把控制返51Testing软件测试网gE1j8R8T6f,m4W t [j
回给你。如果在调用中发生了异常,这个函数将继续运行直到遇到一个断点,一个信号
`@L7Q2C5v!JG0或是退出运行。51Testing软件测试网Bt1z4vL
   * 你不能手工产生一个异常( 即异常只能由程序运行中产生 )51Testing软件测试网2M%f/Ld4OE
   * 你不能手工设置一个异常处理句柄。51Testing软件测试网OJ i7~u7|
   有时'catch'命令不一定是调试异常处理的最好的方法。如果你需要知道异常产生的51Testing软件测试网x6x ?d4ywE
确切位置,最好在异常处理句柄被调用以前设置一个断点,这样你可以检查栈的内容。
)b |{#S3IhS"D(y$j0如果你在一个异常处理句柄上设置断点,那么你就不容易知道异常发生的位置和原因。
;L1FM B%_%dyz0   要仅仅只在异常处理句柄被唤醒之前设置断点,你必须了解一些语言的实现细节。
%k3Gd%|{7F4i%{c1P0比如在GNU C++中异常被一个叫'__raise_exception'的库函数所调用。这个函数的原
gt3W0f$CQ6I"\MN2xr0型是:
V$Agkb_0 
Z.zBji!J0         /* ADDR is where the exception identifier is stored.51Testing软件测试网U7p#DW1q
            ID is the exception identifier.  */51Testing软件测试网 [I'bx)n:k.E.t!KgP
         void __raise_exception (void **ADDR, void *ID);
S$H"h,u|$O sQ0要使GDB在栈展开之前抓住所有的句柄,你可以在函数'__raise_exception'上设置断点。
)n*m(B h-Vu+f+a*n/S0   对于一个条件断点,由于它取决于ID的值,你可以在你程序中设置断点,当某个特51Testing软件测试网spz'jW7kJ Q uX
别的异常被唤醒。当有一系列异常被唤醒时,你可以使用多重条件断点来停止你的程序。51Testing软件测试网;TSKa(W@dgm
 51Testing软件测试网5deh:J;d:G2i/f

VAk4^Y7xg0 51Testing软件测试网~:V|_1g{t2LP

,K \,cb'P ia0删除断点51Testing软件测试网%j's,B U|"C/bt ]
===================
Y"\[ ^,? i7y'[0   很自然当一个断点或是一个观察点完成了它的使命后,你需要把它从程序中删去。51Testing软件测试网%D4T*h4\[/Ady
不然你的程序还会在相同的地方停主,给你造成干扰。使用'clear'命令来从程序中删去51Testing软件测试网/W } HdZD#E#F
一个断点。51Testing软件测试网)H:{8lQ!jF:sW
   使用'clear'命令你可以删除指定位置的断点。使用'delete'命令你可以使用断点号
5g$@"UNU'v+A\Q+t0来指定要删去的断点或观察点。51Testing软件测试网ST`-w~
   在删除断点时不需要先运行过它,GDB会忽略你刚才删去的断点。所以你可以继续运行51Testing软件测试网#asZC rK8ei|
你的程序而不必管断点。51Testing软件测试网U!c6PJ,I2|1`Z
 51Testing软件测试网 }HO6VUu'}`2d
`clear'51Testing软件测试网hcI1pO'v
     在当前选择的栈帧上清除下一个所要执行到的断点(指令级)。当你当前选择帧是栈中
0O3aM1L6k*bj0最内层时使用这个命令可以很方便的删去刚才程序停止处的断点。51Testing软件测试网np;k@.Y%{#c&p%S
 51Testing软件测试网s.Vtq$]L\ x
`clear FUNCTION'51Testing软件测试网?(xq,p0t5kR0KoL
`clear FILENAME:FUNCTION'
My ?t{ Si0     删除名为FUNCITON的函数上的断点。51Testing软件测试网'R-},B,zx LVv
 
u6U:QE;T;S0`clear LINENUM'
X/UO k-h"p6V0`clear FILENAME:LINENUM'
R6^8i0B7Akp+?Fc0     删除以LINENUM为行号上的断点。
,q)fX,W4e(d*r0 51Testing软件测试网~\Py-t_nn([
`delete [breakpoints] [BNUMS...]'51Testing软件测试网} N6I \(x5i@EB0P_d
     删除参数所指定的断点,如果没有指定参数则删去程序中所有的断点。这个命令可以51Testing软件测试网5hq*o@W*@4v
缩写成为'd'51Testing软件测试网1b_MK-_r:^
 51Testing软件测试网ii4W@g
使断点暂时不起作用。51Testing软件测试网&g!a9rB6\(P&Cq"K)i
========================51Testing软件测试网)[-i'SR7u:^o Q
   如果你只是想让断点一时失去作用以方便调试的话,你可以先使断点不起作用。51Testing软件测试网9{/c Q#n|8b G
当你以后又想使用时可以用'enable'命令激活它们。
w?$tPii0   你使用'enable'命令来激活断点或是观察点,使用'disable'命令来使断点或观察点51Testing软件测试网}4u8@5E]1h
不起作用。使用'info break'或'info watch'来查看那些断点是活跃的。51Testing软件测试网Oj+{j)zjv g
   断点或观察点有四种状态:51Testing软件测试网xx2l {8]7q M"| T4MA
   * 使能。当程序运行到断点处时,程序停止。使用'break'命令设置的断点一开始缺省
-p-P1^\s6K:qUFl0是使能的。51Testing软件测试网;yT0z9fk4`$mz
   *不使能。断点对你程序的运行没有什么影响。51Testing软件测试网~%_0i8_+T$Y"d*J j:z
   *使能一次后变为不使能。断点对你的程序运行只有一次影响,然后就自动变成不使能
NRg)iS3S0状态。使用'tbreak'设置的断点一开始缺省是这个状态。
3f6x.Cme)JVN7]0   * 使能一次自动删除。断点在起了一次作用后自动被删除。
'ZO?N jYE0   你可以使用以下的命令来使能或使不能一个断点或观察点。
?"E9O4VA!}P#R0 51Testing软件测试网4|G/W`6\6W2e?&Q;H
`disable [breakpoints] [BNUMS...]'51Testing软件测试网.z*? f.Qf8s wQy
     使由参数指定的断点或观察点变为不使能,如果没有参数的话缺省使所有断点和观察51Testing软件测试网yPQd/^q
点变为不使能。当一个断点或观察点被不使能后在被不使能前的状态被记录下来,在断点或51Testing软件测试网xr8tAB&ZM^){
观察点再次被激活时,原来的状态得到继续。比如一个条件断点或一个设置了51Testing软件测试网 ?1G:h3m}AU@ Q
'ignore-counts'的断点在被使不能后记录活跃时断点被执行的次数,在不使能状态下,断
Y4CS)VXg0点的执行次数(ignore-counts)不增加,直到断点再次被激活时,再继续计算条件
Z7B7MxLY,I K F0(ignore-counts)。你可以使用'disable'命令的缩写'dis'51Testing软件测试网Up4Dp`P|1h(Q
 51Testing软件测试网_-u-P;J:d
`enable [breakpoints] [BNUMS...]'51Testing软件测试网&[RQ;zg
     使能由参数指定的断点或全部断点。
9N??6x(@0 
N7^A4R5@ SHW0`enable [breakpoints] once BNUMS...'
Bu W#VF7E0     功能同上条命令,只是这条命令使断点只使能一次。51Testing软件测试网/z$S:i~QO
 51Testing软件测试网;b iQ+p0g` P|n!FA
`enable [breakpoints] delete BNUMS...'
&jU#|3U \ TI0     功能同上条命令,只是这条命令使被使能的断点起作用一次然后自动被删除。51Testing软件测试网*{\qdLz7Z {O
     除了使用'tbreak'命令所设置的断点以外,断点被设置时都是使能的。
,M#S+So7H E)v0 

QKGBs7B2|051Testing软件测试网#uUa]C0_R

 51Testing软件测试网$I[.](aVI

51Testing软件测试网4~2Z4Q3]{

断点条件51Testing软件测试网7B_+U6VN"H{
===========
6E[/R0`}-Y!ZRg0   最简单的断点就是当你的程序每次执行到的时候就简单将程序挂起。你也可以为断点
l(`M5N_?0设置“条件”。条件只是你所使用的编程语言的一个布尔表达式,带有条件表达式的断点
4aY$E!] op.`0在每次执行时判断计算表达式的值,当表达式值为真时才挂起程序。
W]xBi0   这是使用“断言”的一中形式,在这种形式中你只有在断言为真时才挂起程序。如果51Testing软件测试网%ES1n/s1O
在C语言中你要使断言为假时挂起程序则使用:“!表达式”。51Testing软件测试网 DK{L.RD8S
   条件表达式对观察点也同样有效,但你并不需要它,因为观察点本身就计算一个表达式?nbsp;51Testing软件测试网)md@&I(@sf]C7Y"Y
?nbsp;51Testing软件测试网vd6^ J.^
但它也许会简单一些。比如只在一个变量名上设置观察点然后设置一个条件来测试新的赋
9CY4z*R@+Q(a/S_0值。
o0uhf:t3e0  断点条件可能有副作用(side effects)会影响程序的运行。这一点有时也是很有用的51Testing软件测试网5knF JK5E3x G2Cf
比如来激活一个显示程序完成情况的的函数,或使用你自己的打印函数来格式化特殊的
i@(Y8VF7{m;Ek0数据结构。当在同一位置没有另一个断点设置时,结果是可预见的。(在gdb中如果在同一
s,K%fI*U)CT[[0个地方使用了一个断点和一个条件断点则普通断点可能先被激活。)在条件断点的应用上
k#g%GV|1u0有很多技巧。
S;F[E}2]3H0f N1o*o0   断点条件可以在设置断点的同时被设置。使用'if'命令作为'break'命令的参数。断点51Testing软件测试网S Abt `2zu,K9S
条件也可以在任何时候使用'condition'命令来设置。'watch'命令不能以'if'作为参数51Testing软件测试网 a3`:^ y8Lt?7a
 51Testing软件测试网 D+^+b6]!A"Q
所以使用'condition'命令是在观察点上设置条件的唯一方法。51Testing软件测试网6tO)LU uSn)B.x
 51Testing软件测试网,fP DZ"|3H6E
`condition BNUM EXPRESSION'51Testing软件测试网-Z%c/[,s4\"Q c
     把'EXPRESSIN'作为断点条件。断点用'BNUM'来指定。在你为BNUM号断点设置了条件51Testing软件测试网#B f&I,V6Sf @%T*B
后,只有在条件为真时程序才被暂停。当你使用'condition'命令GDB马上同步的检查
]+N;C&t$a M,A]J0'EXPRESSION'的值判断表达式中的符号在断点处是否有效,但GDB并不真正计算表达式
:P6aj"Bt+Y$d0的值。51Testing软件测试网:R-zV t:[\:k2D ]
 
u9P%D%~)y)B,c'LS+q0`condition BNUM'51Testing软件测试网Zq ?{\-NI W*Dl
     删除在'BNUM'号断点处的条件。使之成为一个普通断点。51Testing软件测试网i8M F-t&Kt%?$v bO
   一个条件断点的特殊例子是时一个程序在执行了某句语句若干次后停止。由于这51Testing软件测试网+l;zz(_)h
个功能非常常用,你可以使用一个命令来直接设置它那就是'ignore count'。每个
)_ Y g `+DVmow4^0断点都有'ignore count',缺省是零。如果'ignore count'是正的那么你的程序在
h v3zaI)f)Jc)H0运行过断点处'count'次后被暂停。51Testing软件测试网{z+PD)c$H hCa
 
2ep'J:E3Q+asq0`ignore BNUM COUNT'
/hS g!w5D^(Iz0     设置第BNUM号断点的'ignore count'为'COUNT'。51Testing软件测试网2@+Z N-~tjf:F
     如果要让断点在下次执行到时就暂停程序,那么把'COUNT'设为0.51Testing软件测试网Zp8v3p-|4LU5u
     当你使用'continue'命令来继续你程序的执行时,你可以直接把'ignore count'
.R#y8fJb5dz7S t0作为'continue'的参数使用。你只要直接在'continue'命令后直接跟要"ignore"的
Cp^d7}1pF0次数就行。51Testing软件测试网LM2?\?
     如果一个断点同时有一个ignore count和一个条件时,条件不被检查。只有当51Testing软件测试网/k Fa3~(v
'ignore count'为零时GDB才开始检查条件的真假。
C.zP S j JqH"f5Bc(O0     另外你可以用'condition'命令来获得与用‘ignore count'同样效果的断点。用法
6{ Q^@%g(R g'ePW!f0是用类似于'$foo--<=0'的参量作为'condition'命令的参数(使用一个不停减量的变量
zdA!VmfuK0作为条件表达式的成员)。
g|{ v;D%}-N\]T0 51Testing软件测试网d l5fl6Uq`QA

`a px7k}y#])M%W0 51Testing软件测试网k:oV mt y A

%Q/j7W4aa#Z0断点命令列表
PI0Jh0G2d0==================
f/^'x0?D'sOD5_z!{0   你可以为任一个断点或观察点指定一系列命令,当你程序执行到断点时,GDB自动执行51Testing软件测试网1N} b-Ol_y
这些命令。例如:你可以打印一些表达式的值,或使能其他的断点。
.Z9FDFUy0 51Testing软件测试网Ae*si%e9?j
`commands [BNUM]'51Testing软件测试网R:VX'F)w~I3^
`... COMMAND-LIST ...'
i,p/g-{ f0`end'51Testing软件测试网0YVs _%l}0U]gZg
     为断点号为BNUM的断点设置一个命令列表。这些命令在'...COMMAND-LIST...'中列
(v3A4ca'A'K)p:XB0出使用'end'命令来表示列表的结束。
,dq,U!b}-Gw0    要删除断点上设置的命令序列,你只需在'command'命令后直接跟'end'命令就可以51Testing软件测试网`*kY xd];lq ~
了。51Testing软件测试网r;nbK4BUyb
    当不指定BNUM时,GDB缺省为最近遇到的断点或是观察点设置命令列表。51Testing软件测试网#D5EdeX2P8f(rl dcf
    使用回车来表示重复使用命令的特性在'...command list...'中不能使用。51Testing软件测试网Jj2@?[
    你可以使用命令列表中的命令来再次使你的程序进入运行状态。简单的在命令列表51Testing软件测试网P P ?D(R
中使用'continue'命令,或'step'命令。
5^t`%b$P*M:A0    在使程序恢复执行的命令后的命令都被忽略。这是因为一旦你的程序重新运行就可
\d@O'}/U0能遇到新的命令列表,那么就应该执行新的命令。防止了二义。
/I)Mn h:I z0bf0    如果你在命令列表中使用了'silent'命令,那么你程序在断点处停止的信息将不被
SU-s0?,eA'E;i0显示。这对于用一个断点然后显示一些信息,接着再继续执行很有用。但'silent'命令51Testing软件测试网,ZtDYE
只有在命令列表的开头有效。51Testing软件测试网8m$a ]w%t
    命令'echo','output'和'printf'允许你精确的控制显示信息,这些命令在"silent"
C$Z#z2m^o"h0断点中很有用。
e9xqlP$A`(sAs0   例如:这个例子演示了使用断点命令列表来打印'x'的值.51Testing软件测试网1\2Dm0l0O1RC1[
 
'V\;^yA!gH0     break foo if x>0
0lx!sO-eY5R0a {6t0     commands
|`#TSE0     silent
]2B?-P)|G0     printf "x is %d\n",x
0C2c ?3xlF0UqF0     cont51Testing软件测试网F/}y)A9Df8U ~
     end
c8{[H"O[7A0   断点命令列表的一个应用是在遇到一个buf之后改正数据然后继续调试的过程。51Testing软件测试网/|1X$O9BUb @%B
使用命令来修改含有错误值的变量,然后使用'continue'命令继续程序的运行。51Testing软件测试网'mGh"fh.r:Yl5d
  使用'silent'命令屏蔽输出:
,n L;XX^"s'L0 51Testing软件测试网!`{ZG v
     break 40351Testing软件测试网,V2JtOb*z#Bm(l
     commands
&h Q T)Qc p;I4Kh0     silent51Testing软件测试网e(mM+m5^}V
     set x = y + 4
&n2a4L:U2cu6t"_b.e0     cont51Testing软件测试网5g?,_Hx E Axo D
     end
G@x)rYw @+H0 

-`WS\9E]&Kx3O051Testing软件测试网8a-[@4Q#ox*{M

 51Testing软件测试网 A\;egn\ y9w

51Testing软件测试网4m}T1G*m9qM!i

断点菜单51Testing软件测试网8d'r.O.z | c
==============51Testing软件测试网'A7L m)rmy4G$M NxQ
   一些编程语言(比如象C++)允许一个函数名被多次使用(重载),以方便应用的使用。51Testing软件测试网S"HS1Q-y"O'J^
当一个函数名被重载时,'break FUNCITON'命令向GDB提供的信息不够GDB了解你要设置51Testing软件测试网U+q*\2q6R&L
断点的确切位置。如果你了解到这个问题,你可以使用'break FUNCITONS(TYPES)'命令51Testing软件测试网-}:\k8c @p
来指定断点的确切位置。否则GDB会提供一个函数的选择的菜单供你选择。使用提示符51Testing软件测试网eM }3k@
'>'来等待你的输入。开始的两个选择一般是'[0] cancel'和'[1] all'输入1则在所有
"c^*Z%BC$S8Z?D0同名函数上加入断点。输入0则退出选择。51Testing软件测试网:Hfq&V%WR%{b
   下例为企图在重载的函数符号'String::after'上设置断点。51Testing软件测试网z@ n~brA
     (gdb) b String::after51Testing软件测试网_Bu#Q J&fX
     [0] cancel51Testing软件测试网+J]~;|Z?Ne
     [1] all51Testing软件测试网_&Dz7YN2N F)s
     [2] file:String.cc; line number:86751Testing软件测试网2p4p,Z~$q[)]X#a9w1Z|
     [3] file:String.cc; line number:860
3bcC7z({1Z r0     [4] file:String.cc; line number:87551Testing软件测试网"r_*v jn i6x
     [5] file:String.cc; line number:853
5~@ T?c y3{$W"Z0     [6] file:String.cc; line number:84651Testing软件测试网KCA0|#`f"^IwY9i
     [7] file:String.cc; line number:73551Testing软件测试网8Q^7T_ U
     > 2 4 651Testing软件测试网4q*X)|+`/AJ"Jgg
     Breakpoint 1 at 0xb26c: file String.cc, line 867.51Testing软件测试网v$f)^\(H4v){-Q:]
     Breakpoint 2 at 0xb344: file String.cc, line 875.
#[&K7\^;]|}0     Breakpoint 3 at 0xafcc: file String.cc, line 846.
] l0mfi;\ Su{(|0     Multiple breakpoints were set.51Testing软件测试网Ntb2U*|2F Y
     Use the "delete" command to delete unwanted
J0H C#k-P/om-G-u^U0      breakpoints.
,Sy$m7vadZ&t0     (gdb)51Testing软件测试网*`h2r;IN'n ck/h1[
 
Y.x_d R{0

kZ1lQh_*ud6]*Q0

TAG: GDB 软件开发

 

评分:0

我来说两句

Open Toolbar