GDB使用手册
上一篇 / 下一篇 2007-12-07 23:57:11 / 个人分类:软件开发
简述51Testing软件测试网A{6Np1Z;s)R
一 列文件清单
5cIk.T/|m p:I0二:执行程序
)]_2p
f;y:B](p0三:显示数据51Testing软件测试网0~F[!}uLp
四:断点(breakpoint)51Testing软件测试网C n%E
Ar
五.断点的管理
n~0?2yHy5n0六.变量的检查和赋值
,eaB)nkY{0七. 单步执行51Testing软件测试网I/N2c2~/`b7hd@3|"I
八.函数的调用51Testing软件测试网H/f3f4|S7t
九.机器语言工具
P#hl[T} S0十.信号51Testing软件测试网
i4g&E['Aww(@ v1z
GDB的使用方法51Testing软件测试网
~
g*K"\ c7k%Dh
简述
7T8Q6PC Bp.k6[0一 列文件清单
"pR/_2y.`;A(Jyd0List
"jTE]8Y h9e ?rgR0(gdb) list line1,line251Testing软件测试网*k-s
tBZ2X
二:执行程序
~3NT)\M9N+`1a0要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和> )和外壳通配符(*、?、[、])在内。如果你使用不带参数的run命令,gdb就再次使用你给予前一条run命令的参数,这是很有用的。利用set args 命令就可以修改发送给程序的参数,而使用show args 命令就可以查看其缺省参数的列表。51Testing软件测试网,B_(}Hh+i\5T
(gdb)set args –b –x51Testing软件测试网3t1k_H ?'Z]
(gdb) show args
h;b+L%p
V%X"J R0backtrace命令为堆栈提供向后跟踪功能。
;H7M_glF
v0Backtrace 命令产生一张列表,包含着从最近的过程开始的所以有效过程和调用这些过程的参数。
三:显示数据
NBH%vc0利用print 命令可以检查各个变量的值。51Testing软件测试网:D#sFz#\F"O*C~
R
(gdb) print p (p为变量名)51Testing软件测试网'rJ k c7a0i*J
w
R:d6O$ELvT&KA$Ex0print 是gdb的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。表达式除了包含你程序中的变量外,还可以包含以下内容:51Testing软件测试网*j~ F
[3v9CPn
对程序中函数的调用51Testing软件测试网hi3R|}
J4Kjw)k
(gdb) print find_entry(1,0)
:SO!R7fG0数据结构和其他复杂对象51Testing软件测试网uUeF4L!I-YA
(gdb) print *table_start51Testing软件测试网J[k$}4f%V
S
$8={e=reference=’\000’,location=0x0,next=0x0}51Testing软件测试网;G`2gdKSD_
值的历史成分51Testing软件测试网
_(B&EPcNHfx4W
(gdb)print $1 ($1为历史记录变量,在以后可以直接引用 $1 的值)51Testing软件测试网ht.^XPc Uj@
"Se-R W-Cn
]9f0人为数组
)kO*r/j7ey0人为数组提供了一种去显示存储器块(数组节或动态分配的存储区)内容的方法。早期的调试程序没有很好的方法将任意的指针换成一个数组。就像对待参数一样,让我们查看内存中在变量h后面的10个整数,一个动态数组的语法如下所示:51Testing软件测试网GZD9X;|
base@length
o8@!L4l!EN.m7OP"e0因此,要想显示在h后面的10个元素,可以使用h@10:
DB4y5|j%Hk0(gdb)printh@1051Testing软件测试网P,eKo5]z
$13=(-1,345,23,-234,0,0,0,98,345,10)51Testing软件测试网J&eL-i6X@ v[ [6[_
}_O*PSf2u"z"^0whatis 命令可以显示某个变量的类型
+|oARV0(gdb) whatis p51Testing软件测试网-jqF+C8xI
type = int *
K%P;K8\8GX
\s%?0四:断点(breakpoint)51Testing软件测试网f9{ Qp0cX
break命令(可以简写为b)可以用来在调试的程序中设置断点,该命令有如下四种形式:51Testing软件测试网rXCfP
break line-number 使程序恰好在执行给定行之前停止。51Testing软件测试网D!}5A{ny@5Rd5~V
break function-name 使程序恰好在进入指定的函数之前停止。
/ra+iXY1d$K$u0break line-or-function if condition 如果condition(条件)是真,程序到达指定行或函数时停止。51Testing软件测试网q2f1]5NkM/[;~j
break routine-name 在指定例程的入口处设置断点
F'|q:^;Vz4s0如果该程序是由很多原文件构成的,你可以在各个原文件中设置断点,而不是在当前的原文件中设置断点,其方法如下:51Testing软件测试网Z,u2{2@m9NmA
(gdb) break filename:line-number
w J%b+ecM0(gdb) break filename:function-name
要想设置一个条件断点,可以利用break if命令,如下所示:51Testing软件测试网#Vt9Bw!M#j9[
(gdb) break line-or-function if expr
#|+L&Tq
L&f`0例:
*at
JNY
oDV!Cu6k0(gdb) break 46 if testsize==10051Testing软件测试网ey;|qU;J5Z2H
|w6pO)d2{+s+hj#B0从断点继续运行:countinue 命令
m8jW ~'ll051Testing软件测试网 z(qwtW-@,Hc9w五.断点的管理
w%_4d(w W*m(e@Q01.显示当前gdb的断点信息:
(gdb) info break51Testing软件测试网4Dh UU2@ ~w
Rz
ka)qX.m}0他会以如下的形式显示所有的断点信息:
i4Z+`Y7iF0Num Type Disp Enb Address What51Testing软件测试网R,_ ~Go Wo i1x
1 breakpoint keep y 0x000028bc in init_random at qsort2.c:15551Testing软件测试网7j.xj}T&YiBB
2 breakpoint keep y 0x0000291c in init_organ at qsort2.c:16851Testing软件测试网#R+VZP5h`
删除指定的某个断点:51Testing软件测试网 u#u1YM9?@#U
(gdb) delete breakpoint 151Testing软件测试网,RY3nxPMFC
2Nf:_.v1Bf u#R0该命令将会删除编号为1的断点,如果不带编号参数,将删除所有的断点
A{9o'H"Wd0(gdb) delete breakpoint
禁止使用某个断点51Testing软件测试网y_.juP4D
(gdb) disable breakpoint 1
w3C8ULO"n5P0^0vu0该命令将禁止断点 1,同时断点信息的 (Enb)域将变为 n51Testing软件测试网0}7gd.P+Z bW:m
允许使用某个断点
}&p,A;z;w;t`F+s,Y$K0(gdb) enable breakpoint 151Testing软件测试网7Ox6K4\
?
|1Z*f
|bmy@I0该命令将允许断点 1,同时断点信息的 (Enb)域将变为 y51Testing软件测试网wv6Cr\CO
清除原文件中某一代码行上的所有断点
8V{%j}9gbO4f
k0(gdb)clean number
Q4IJ
LOk8L0注:number 为原文件的某个代码行的行号
l3YZ1]a2U0六.变量的检查和赋值51Testing软件测试网qu6v-Wup+R/z,}
whatis:识别数组或变量的类型
n%Sh9knF
S,rI0ptype:比whatis的功能更强,他可以提供一个结构的定义51Testing软件测试网$Y'kJ4_"fbkJ
set variable:将值赋予变量
Vj_qNdqG&|U0print 除了显示一个变量的值外,还可以用来赋值51Testing软件测试网%h
X)[[c`
七. 单步执行51Testing软件测试网+NNJg:n8c Y4r7H)_,Z
next 不进入的单步执行51Testing软件测试网Hg ]\ez
step 进入的单步执行如果已经进入了某函数,而想退出该函数返回到它的调用函数中,可使用命令finish51Testing软件测试网1TO
JG
s
八.函数的调用51Testing软件测试网Z!` j5B:n|,g
call name 调用和执行一个函数
\;{#D#dm0(gdb) call gen_and_sork( 1234,1,0 )51Testing软件测试网u*u&J3q
jxT8P
(gdb) call printf(“abcd”)51Testing软件测试网}MA@0z9zc.d
$1=451Testing软件测试网2jv[+D p
Q&YV]Xzh/AK0finish 结束执行当前函数,显示其返回值(如果有的话)51Testing软件测试网N5OL,^Q iz
九.机器语言工具
5G!ci3Y$_5U0有一组专用的gdb变量可以用来检查和修改计算机的通用寄存器,gdb提供了目前每一台计算机中实际使用的4个寄存器的标准名字:
$pc : 程序计数器51Testing软件测试网y'Ge)I(hWsH
$fp : 帧指针(当前堆栈帧)51Testing软件测试网"^?s0H9h;{&}9C
$sp : 栈指针51Testing软件测试网Pm-I;Q)P
$ps : 处理器状态
oD3](\}0十.信号51Testing软件测试网`M'd3^7O
gdb通常可以捕捉到发送给它的大多数信号,通过捕捉信号,它就可决定对于正在运行的进程要做些什么工作。例如,按CTRL-C将中断信号发送给gdb,通常就会终止gdb。但是你或许不想中断gdb,真正的目的是要中断gdb正在运行的程序,因此,gdb要抓住该信号并停止它正在运行的程序,这样就可以执行某些调试操作。51Testing软件测试网1qV$r[4nGHw
[/P i I CqBN u0Handle命令可控制信号的处理,他有两个参数,一个是信号名,另一个是接受到信号时该作什么。几种可能的参数是:51Testing软件测试网w-cY5R ?%Rtc!~
sj;|3VGu0nostop 接收到信号时,不要将它发送给程序,也不要停止程序。51Testing软件测试网{F3E-trqSU f
stop 接受到信号时停止程序的执行,从而允许程序调试;显示一条表示已接受到信号的消息(禁止使用消息除外)51Testing软件测试网g+p [1q8U9s3X }mD
print 接受到信号时显示一条消息
4Uw a(w)~,pJV0noprint 接受到信号时不要显示消息(而且隐含着不停止程序运行)
2_;o w#}k:e)b+U.]2V+wI0pass 将信号发送给程序,从而允许你的程序去处理它、停止运行或采取别的动作。
;v"R0w~L^S0nopass 停止程序运行,但不要将信号发送给程序。51Testing软件测试网E2bvd8tv6V
例如,假定你截获SIGPIPE信号,以防止正在调试的程序接受到该信号,而且只要该信号一到达,就要求该程序停止,并通知你。要完成这一任务,可利用如下命令:
(gdb) handle SIGPIPE stop print51Testing软件测试网}7]z0|_?
51Testing软件测试网2}"N Q#X]5bj请注意,UNIX的信号名总是采用大写字母!你可以用信号编号替代信号名如果你的程序要执行任何信号处理操作,就需要能够测试其信号处理程序,为此,就需要一种能将信号发送给程序的简便方法,这就是signal命令的任务。该命令的参数是一个数字或者一个名字,如SIGINT。假定你的程序已将一个专用的SIGINT(键盘输入,或CTRL-C;信号2)信号处理程序设置成采取某个清理动作,要想测试该信号处理程序,你可以设置一个断点并使用如下命令:51Testing软件测试网7K[gyVJa
Dy
(gdb) signal 2
$J"\6wZTh0continuing with signal SIGINT(2)
该程序继续执行,但是立即传输该信号,而且处理程序开始运行.
`A8Zs$T6_f+]051Testing软件测试网-{;~+};`i]C!MGDB的使用方法
x9v{0cgWlF0GDB是一个强大的命令行调试工具。大家知道命令行的强大就是在于,其可以形成51Testing软件测试网B1wy-a \"Y/R
执行序列,形成脚本。UNIX下的软件全是命令行的,这给程序开发提代供了极大的
^M
\wo&c0便利,命令行软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已
jYZ9vK;j0有工具的命令,就可以做出一个非常强大的功能。51Testing软件测试网jYxa9@i^%[vO {
v0|I/WLA!g,X0f0于是UNIX下的软件比Windows下的软件更能有机地结合,各自发挥各自的长处,组合51Testing软件测试网,AZ7[-pt+y"i
成更为强劲的功能。而Windows下的图形软件基本上是各自为营,互相不能调用,很51Testing软件测试网x#OA\1D|5a3cf
不利于各种软件的相互集成。在这里并不是要和Windows做个什么比较,所谓“寸有51Testing软件测试网a*Q,{p hCT o
所长,尺有所短”,图形化工具还是有不如命令行的地方。51Testing软件测试网c(}n8wFB-^$Dm8r"h
用GDB调试程序
i7?P^~6B,f051Testing软件测试网x:_7oHI!bzH.`gGDB概述
7q9[Q Wt#V)qm%bY(T0————
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢
%zHvJbIa,]V#|0那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你51Testing软件测试网[x7s!T5gNRiE W
会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所51Testing软件测试网d0g/{#}p5^)C4i
长,尺有所短”就是这个道理。
一般来说,GDB主要帮忙你完成下面四个方面的功能:
7c m eiuOd*T0A E)ej `6WJR|
W|01、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。51Testing软件测试网l
Mz
TU,|
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)51Testing软件测试网k+yY^c1c
3、当程序被停住时,可以检查此时你的程序中所发生的事。51Testing软件测试网)H3oG&AF+X!M
4、动态的改变你程序的执行环境。
从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过51Testing软件测试网#M"sU5hu)R#~
在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工51Testing软件测试网9S*h q-o/bV
具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。让我们一
p_-oM%X n[0一看来。51Testing软件测试网`kC5R.T`&BD*x
一个调试示例51Testing软件测试网|v8`.R0L(j5u,Y
——————51Testing软件测试网*z+e:W-{3kTfq
源程序:tst.c
#jP,Q fp\i];h*W%w051Testing软件测试网n.{)@ yK{L#~(~'t1 #include
6Pe Y Tv:w V$B"@02
\i2BY8[e1lWMy
~03 int func(int n)51Testing软件测试网2y&m,WY+IB
4 {
BHWfB/_S'R05 int sum=0,i;
? \9v?4C0{4}G"b06 for(i=0; i
Oh+k6e9_6}z/q
@Bo07 {51Testing软件测试网9p%h7]hT7H6{
8 sum+=i;
U1]i5[6W5_zx09 }
H8M sWlap010 return sum;
w%[:t;p2?)VB011 }
0FA,` APE$vA.j012
m/C2f`](VN01351Testing软件测试网p@3fjE3W N~
14 main()51Testing软件测试网sp#ze,ho%d,z
15 {
l0S%o+K6p016 int i;
Xt"]p/R017 long result = 0;
Ma
mR*H5B ^X018 for(i=1; i<=100; i++)51Testing软件测试网+H.m$bP1^9cl^
19 {
h&o M
Y8mE8\'h020 result += i;
?HXGx!u021 }51Testing软件测试网&be;Wz7N0U
22
`loOHR V:L
v023 printf("result[1-100] = %d \n", result );51Testing软件测试网
tw8u+Gnh
24 printf("result[1-250] = %d \n", func(250) );51Testing软件测试网dQ
Sc
O
ye
25 }51Testing软件测试网"hQTE!H!r3Z
编译生成执行文件:(Linux下)51Testing软件测试网aXZK2oZeq4E
hchen/test> cc -g tst.c -o tst
使用GDB调试:
'MR;K+l|'e051Testing软件测试网p/N Oi7fhchen/test> gdb tst <---------- 启动GDB51Testing软件测试网-R3Z:HRk4HF$NGp0{$]^
GNU gdb 5.1.151Testing软件测试网_*p-h
`!P
K E(A+G"i&G{
Copyright 2002 Free Software Foundation, Inc.51Testing软件测试网$QaaZ;KC
GDB is free software, covered by the GNU General Public License, and you are
cq}`z9pEK0welcome to change it and/or distribute copies of it under certain conditions.51Testing软件测试网 f~c
o|*Q#w'l
Type "show copying" to see the conditions.
E@m:E]I*Qh0There is absolutely no warranty for GDB. Type "show warranty" for details.
A X*O2n'cg t&\%u0This GDB was configured as "i386-suse-linux"...
"W]}o?C&Y;q0(gdb) l <-------------------- l命令相当于list,从第一行开始例出原码。
,N l6x~/cRV01 #include
j-Mv;y2l#@Z:K0251Testing软件测试网W0p
T.JRR0Gb
3 int func(int n)
%[5jlb;jqHr.|04 {51Testing软件测试网 O+rS`wj/[ K.h)F
5 int sum=0,i;51Testing软件测试网\5@tz(_/X
6 for(i=0; i51Testing软件测试网$dO/I;@x6dr8kF%QU
7 {51Testing软件测试网Dy+lXAhf,p
8 sum+=i;51Testing软件测试网$u6vS5j[ AO[
9 }
5R~m H$v-Y~010 return sum;
*Kx_%F,B*^0(gdb) <-------------------- 直接回车表示,重复上一次命令51Testing软件测试网0a9f(g:D7b%uiRs
11 }51Testing软件测试网a(} D(u:qQ;I
12
3I!w,M$z8yD4n013
?*iZ @kN014 main()
](Aa
x3yS015 {
-a1[)~]R.}?-d:CA016 int i;
?1?*_,FsS017 long result = 0;51Testing软件测试网 m8]#x7L#I D:P6Y$C
18 for(i=1; i<=100; i++)
l(~g f+{/p019 {
0\5Zm"tF]e9Hn(|020 result += i;51Testing软件测试网w8VC!a'UD2rp
(gdb) break 16 <-------------------- 设置断点,在源程序第16行处。51Testing软件测试网 DE-BXz&j2Vm9H
e)a
Breakpoint 1 at 0x8048496: file tst.c, line 16.
D"w XH?;y_[0(gdb) break func <-------------------- 设置断点,在函数func()入口处。
2Ja-vho#tF0Breakpoint 2 at 0x8048456: file tst.c, line 5.51Testing软件测试网"ZRz!aY @6C
(gdb) info break <-------------------- 查看断点信息。51Testing软件测试网Ft kdm-~4X
Num Type Disp Enb Address What51Testing软件测试网%K
~nW5w\8f
1 breakpoint keep y 0x08048496 in main at tst.c:1651Testing软件测试网,B*N j@m
2 breakpoint keep y 0x08048456 in func at tst.c:551Testing软件测试网D~^1Q(E
oR
(gdb) r <--------------------- 运行程序,run命令简写51Testing软件测试网1r[[8I}.zp3o
Starting program: /home/hchen/test/tst
6X|aX8y s/E][7@0Breakpoint 1, main () at tst.c:17 <---------- 在断点处停住。51Testing软件测试网#iA fE/oT)JM\
17 long result = 0;51Testing软件测试网(G8@S\U
(gdb) n <--------------------- 单条语句执行,next命令简写。51Testing软件测试网7h,U3rsWL
18 for(i=1; i<=100; i++)
'Y!nRh-z9T1k%}%@0(gdb) n
Y^/_F-w#o&y%a020 result += i;
(X~#WfP[0(gdb) n51Testing软件测试网,q9V'm+U a6})S`#z
q
18 for(i=1; i<=100; i++)
b!zr4C,b6M0(gdb) n
5a'rJ@'z3lDqv020 result += i;
,j:_,q/rs)^Hk:P`7~0(gdb) c <--------------------- 继续运行程序,continue命令简写。51Testing软件测试网
y7d%jJ"xs4u R
Continuing.51Testing软件测试网9h(N ]n2zC){e
result[1-100] = 5050 <----------程序输出。
Breakpoint 2, func (n=250) at tst.c:551Testing软件测试网 YX2p Ib!}
5 int sum=0,i;51Testing软件测试网a$h2hwZ[
(gdb) n
-Q$rN7gv1q06 for(i=1; i<=n; i++)51Testing软件测试网(@ pc7aXMAH
(gdb) p i <--------------------- 打印变量i的值,print命令简写。51Testing软件测试网-l$G2h-l9L,H
$1 = 13451380851Testing软件测试网u(@u-Ej
M
(gdb) n51Testing软件测试网9rz&E/u}t C~L:B
8 sum+=i;51Testing软件测试网mQdDL9nE |x0_
(gdb) n
A$YX-YpB@"JC|L06 for(i=1; i<=n; i++)
(B5Z4Rr;d J4K(o0(gdb) p sum51Testing软件测试网FML2YI*}$L9fg
$2 = 151Testing软件测试网+R+LAY4Ph.S9N|0M
(gdb) n51Testing软件测试网+Q(C(S!X hB
8 sum+=i;
maw*xX/G5r0(gdb) p i51Testing软件测试网5^#l.O.LF7c1~f
$3 = 251Testing软件测试网/t#~
q0Z,\m n,d
(gdb) n51Testing软件测试网,u-HX~%t5YA4H
6 for(i=1; i<=n; i++)
#PD'AXFf)U0(gdb) p sum51Testing软件测试网3F fv
J z/S+N7m
$4 = 3
"q[&gKt!YzgO0(gdb) bt <--------------------- 查看函数堆栈。
^!kg4V'v%Vo0#0 func (n=250) at tst.c:551Testing软件测试网U(syI;tSL
#1 0x080484e4 in main () at tst.c:24
7T5_Z#XB:k{ n0#2 0x400409ed in __libc_start_main () from /lib/libc.so.6
W)XX9[7n }6d-G8e0(gdb) finish <--------------------- 退出函数。
7{vr)x/c5\%z0Run till exit from #0 func (n=250) at tst.c:5
{KGs8[]C00x080484e4 in main () at tst.c:2451Testing软件测试网'QI7BsJ/D,[J
24 printf("result[1-250] = %d \n", func(250) );
v9@q/c,SU
B7i&C0Value returned is $6 = 31375
oXkC w(Hb(b5?R0(gdb) c <--------------------- 继续运行。51Testing软件测试网
m3U/W K
RQ
Continuing.
RG3M4\je,c6a0result[1-250] = 31375 <----------程序输出。51Testing软件测试网g
F7dq8wb8T%fI
Program exited with code 027. <--------程序退出,调试结束。51Testing软件测试网kL0u|x/q!j9e
(gdb) q <--------------------- 退出gdb。
7uI4AaK2Qyh`t;lQ0hchen/test>51Testing软件测试网(\;ysJDc'y(k)F
.xU3{e6H3i6v:L8eNl0好了,有了以上的感性认识,还是让我们来系统地认识一下gdb吧。51Testing软件测试网 |,F*o_;f{!E
0czu}/gy jY/Y.{
K0使用GDB
4jh\+a"ndjkN"}0————
一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们51Testing软件测试网8j8]JVdZj`8Y a
必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以51Testing软件测试网+?)c&k0r#Z)vS}
做到这一点。如:
XV [np8A}0> cc -g hello.c -o hello51Testing软件测试网;G?X"C1?;gT
> g++ -g hello.cpp -o hello51Testing软件测试网Txx!HN#O
yJ
\9u)[3C#O U0如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。51Testing软件测试网v
|`z:w9Z6h;EH4W l
当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用51Testing软件测试网,m8b/W.dG
gdb来调试他。51Testing软件测试网 b e'A M\*uN
(@]*Cl\cF#l6^,B0启动GDB的方法有以下几种:51Testing软件测试网~.]_wzK,}| RBN
:aZ8uO_r01、gdb
8M,YP4f5sR}-p
m8c0program也就是你的执行文件,一般在当然目录下。
2、gdb core
7L@8s'@ Z:\0用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。
KvQwq5p"b ~`|03、gdb51Testing软件测试网m J&F1t h
51Testing软件测试网OKT.W)B/jl如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。51Testing软件测试网kD/{D_ OsZK6i7rO%F
gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。51Testing软件测试网9E+H6J.A:\4mp
GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb -help查看。我在下面只例举一些比较常用的参数:51Testing软件测试网~NDbi"Wt&@b
51Testing软件测试网c,gUq8UN!A-symbols51Testing软件测试网6o{6YRd |)EB
-s
1KJ2J N R
o4F-H%V^0从指定文件中读取符号表。51Testing软件测试网plr6^!l R]x
-se file51Testing软件测试网
u3r3utLT
^
从指定文件中读取符号表信息,并把他用在可执行文件中。51Testing软件测试网8I2KwF D}9FOC9B
-core
`BS2az0-c
7q0\vKE-c0调试时core dump的core文件。51Testing软件测试网Bh
Yw3R&g_
I)We9Gb/j&p0-directory51Testing软件测试网.a!r:C]L j"t7M
-d
L va4bdL-[D'P0加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径。51Testing软件测试网-[%Ii#j1F3q-H
olOVU6G1c0GDB的命令概貌51Testing软件测试网&J6_Ev,b
———————51Testing软件测试网!R YlS6H:eq
启动gdb后,就你被带入gdb的调试环境中,就可以使用gdb的命令开始调试程序了,gdb的命令可以使用help命令来查看,如下所示:
(f(IT~(K7q051Testing软件测试网!}`&yo+@4iO7I-u)u/home/hchen> gdb
&G3W`X!F*WF,}a
r0GNU gdb 5.1.1
E e2G(j)M[/P9G8}%N0Copyright 2002 Free Software Foundation, Inc.
J
W9A8N3QrS0GDB is free software, covered by the GNU General Public License, and you are51Testing软件测试网s.@
HM*u_2?%^aE
welcome to change it and/or distribute copies of it under certain conditions.
'w`5yY)[#b0Type "show copying" to see the conditions.
:R/{Q%NJ i k`$t0There is absolutely no warranty for GDB. Type "show warranty" for details.51Testing软件测试网7tIF
S$lO'E
|9a
This GDB was configured as "i386-suse-linux".51Testing软件测试网
yM_'J a&kKK
(gdb) help
F(P7h6w-f9u0List of classes of commands:51Testing软件测试网Ze2\7nYjXWQ
*bn0y;_6x,L/Y yd0aliases -- Aliases of other commands
d-~-q,~t(Z]&n dc0breakpoints -- Making program stop at certain points51Testing软件测试网9T9F n n3C`Qi%{
data -- Examining data51Testing软件测试网8X)cHJ ne%J$\-[ F6j
files -- Specifying and examining files51Testing软件测试网HLlnlU Yc1k\
internals -- Maintenance commands
*G.] _d$z"p [0obscure -- Obscure features
Y
r z
l3s6O0running -- Running the program
CC0|&N^"B:hS7L0stack -- Examining the stack
'wc$k`K@'y [Yoi"|(Z0status -- Status inquiries
o1A)@2sf0support -- Support facilities
.|Y:k5B5JY0tracepoints -- Tracing of program execution without stopping the program
C| @ s\`7r0user-defined -- User-defined commands
Type "help" followed by a class name for a list of commands in that class.51Testing软件测试网$Q#C+h7IKi;TfW.zak
Type "help" followed by command name for full documentation.
g1` WM@ ^zl0Command name abbreviations are allowed if unambiguous.
Cp*w
u|1p0(gdb)51Testing软件测试网6efR$^ G&jP
j B1m;@;d.R.T.p~/}o0gdb的命令很多,gdb把之分成许多个种类。help命令只是例出gdb的命令种类,如果
,zA0RB:Fe]0要看种类中的命令,可以使用help 命令,如:help breakpoints,查看设置断点的所51Testing软件测试网0pD}aTv
有命令。也可以直接help 来查看命令的帮助。51Testing软件测试网(Ycce#W7U rj
8~/M+o2BIA9^@~/^_0gdb中,输入命令时,可以不用打全命令,只用打命令的前几个字符就可以了,当然,51Testing软件测试网u3Xc#h:}hO
命令的前几个字符应该要标志着一个唯一的命令,在Linux下,你可以敲击两次TAB
4dL;^$Q"LE0[FQ!KL0键来补齐命令的全称,如果有重复的,那么gdb会把其例出来。
_7B!X }W$gk6F0示例一:在进入函数func时,设置一个断点。可以敲入break func,或是直接就是b func51Testing软件测试网av7UI3m fO
(gdb) b func51Testing软件测试网q7p;MZp{&qE
Breakpoint 1 at 0x8048458: file hello.c, line 10.
#kH9Nw/Xy!D0示例二:敲入b按两次TAB键,你会看到所有b打头的命令:51Testing软件测试网osAZX:JTS5v
(gdb) b51Testing软件测试网4l.uh5v3x5s m:z"FN
x3lk
backtrace break bt
X%Bo |5{0(gdb)51Testing软件测试网7n!mv0G7@#^tQ}
示例三:只记得函数的前缀,可以这样:51Testing软件测试网!D:d]C Y:oG
(gdb) b make_ <按TAB键>51Testing软件测试网GD@@5|+ug*r e(\
(再按下一次TAB键,你会看到:)51Testing软件测试网(]E)_dY.P)D
make_a_section_from_file make_environ
/U-iw'z_0make_abs_section make_function_type51Testing软件测试网sJ1E?{
make_blockvector make_pointer_type
(_IW4n
R4s#t0make_cleanup make_reference_type
k_hmb5p'C0make_command make_symbol_completion_list51Testing软件测试网*Q*jRw~z'A1ir1BH
(gdb) b make_
8X#d'T:mYP#Ef0GDB把所有make开头的函数全部例出来给你查看。
xYTC
~ j0示例四:调试C++的程序时,有可以函数名一样。如:
| ?4^P@
|3xb#|"@0(gdb) b 'bubble( M-?51Testing软件测试网
tVVid6|
bubble(double,double) bubble(int,int)
L
Q*n;h4v6]c0(gdb) b 'bubble(51Testing软件测试网.vt f,ZZ x
uGj'U+}
你可以查看到C++中的所有的重载函数及参数。(注:M-?和“按两次TAB键”是一个意思)