我是大帅哥,擅长LINUX和C语言,还有脚本,希望和大家交朋友 mail:newhitler@163.com

《GDB软体调试工具》练习题

上一篇 / 下一篇  2007-10-09 00:02:17 / 个人分类:C语言编程

1)新建源代码程序(程序有逻辑错误)如下:LUPA开源社区XX KkFa J&[v [
#include <stdio.h>LUPA开源社区PB0ov C+pmZ8M
int wib(int no1, int no2)
!}*R M)^/o0{LUPA开源社区 ^ aVu'o+^nio
int result, diff;
Kjr nmS$r,V]0diff = no1 - no2;LUPA开源社区o IU S7h;\
result = no1 / diff;
TA3k2a Q0return result;
AHqSj0g9]0}
"g![8uT}2R(]&H"`0Q0int main(int argc, char *argv[])
6~'_1@ km9d%[K1L:L6x0{LUPA开源社区+RD%w kVk/@
int value, div, result, i, total;LUPA开源社区'U G*|TZ:Ih
value = 10;LUPA开源社区._&iS2U!i4mCR C
div = 6;
6g"ur(HA K.E0total = 0;LUPA开源社区 s0s&y$J6E I+F?J
for(i = 0; i < 10; i++)LUPA开源社区:~zlK(|cH
{
k`0\H_2|-?2_F9t0result = wib(value, div);LUPA开源社区Ck{7C[:a2~F4]
total += result;LUPA开源社区$L@-L] {0a
div++;LUPA开源社区k%t5Q&cZd0\(TD:RW
value--;LUPA开源社区h$m+^(Zhb&K
}LUPA开源社区].K#q4h"r4A${
printf("%d wibed by %d equals %d\n", value, div, total);
G y'@)KGq] rp0return 0;
7hChr/H4E%L9_0}
-^o3lYJ0B1rC8Rc0
;@4|4{;T K6~#c&y!aV0参考答案:LUPA开源社区;h?/Xaeo y
vi a.c
x,@8T0ha_!_0加入以上内容
uvg:h6|Cj a Q0
FxN&H,g L s9@ V0
5JgM!^({E3D0LUPA开源社区Z%rF9s{J2Ph7[|
2)编译a.c,生成可执行程序a.out,并加入调试选项LUPA开源社区#v8y jUh*f/je4A)AV

7m\C!b,j3r j9m0参考答案:
+k5mpmM9Eb0gcc -g a.c -o a.outLUPA开源社区 q:o,bm\3Z l VO
LUPA开源社区S5N/?%S~#\$ln@$Y

CU0X:l$]5sV ql0LUPA开源社区Wb` V&[s
3)用gdb命令加载程序a.outLUPA开源社区bM$JHwc1q

!Z,Y$]S.P(Y5iB%Z4g'Jrv0参考答案:
f8E I7K/T0gdb a.out
(nz;~@@#{g0LUPA开源社区\!N&F%G:| qF ~

;@G3\C3n TT0LUPA开源社区1h.O.x!s\
4)用run命令运行a.out,此时程序报错,用list命令打印10行代码LUPA开源社区"K5cF2O+c;@

p"b r@ u k8d~0参考答案:
x,S%]B/h#lW0runLUPA开源社区4i8TwZ~3]ufD
LUPA开源社区 WPc#a/g"x
listLUPA开源社区4m%jD&TO[c6N.zX

L5S+q*X-\6EG k0
&f'BGE,?[a0LUPA开源社区8tZfH5S\'qf,vO
5)打印no1和diff变量,检查出错原因
5{*`]U/p&rd X0
"B;k7OP:]q b$E-V)t(MT0参考答案:
tgp D'~,w3bQ"@ R)B0print no1
(SU2c[T ]0LUPA开源社区q }5c"Ic!Q3T VmR
print diffLUPA开源社区r:W_/\!z$m] F
LUPA开源社区3e~B WJ P%J^8iv
LUPA开源社区.Pi_T#c3m&`!v
LUPA开源社区7? Rb@:b
6)用continue命令告诉程序继续运行
c*X:?dW}0
4m)U8\"q9^:O&}VD0参考答案:
)q/tW7ZAGqK |\){0continue
S"uoqb0
`5I~v5M0
/@4p(~]!FA9t D0
4d"@C7X,SY07)用break在wib() 函数调用一行设置断点,并运行程序
~!s1r\o U0^Od"krj0
hs%@f#A)jTA'WQ5@ j;d0参考答案:LUPA开源社区s V4\&^s YD w
break 17
O!f@.r zB0LUPA开源社区Lgoa-\1`4M L
runLUPA开源社区l"St)T0\q3{t

Mw BA-O0
2{ L:| L8q_0LUPA开源社区B^rdz6Tf8} T
8)显示此时所有局部变量的值LUPA开源社区2iIx4^Y*i
LUPA开源社区4Z p p^y)Cmb$p
参考答案:
0H-nAl1@;hk.m*^0info localsLUPA开源社区tzQ l$K
LUPA开源社区 P*c`2]'oF8`Z&mg
LUPA开源社区,]9z!Z/gu*JWXO E

+}'{Q JQ |09)当"value"和"div"相等时就会出现问题,因此输入 'continue' 继续执行LUPA开源社区5^?k m H1mL$^
LUPA开源社区 f,RKp6r[
参考答案:LUPA开源社区J m2B~'l
continueLUPA开源社区.\U4m(Ljd

Xh8}9ZA(N+PJ-n0LUPA开源社区0Ofu.sD

V/} s(dUiGak010)显示此时所有局部变量的值,检查是value=9 和 div=7?
H$T7TsZ.}pPQ%r/]0LUPA开源社区 U|T:}qAn2Q
参考答案:LUPA开源社区s#j1~1[yN4m
info localsLUPA开源社区$b+iLL/Q&\

/c vXIN.k0LUPA开源社区 [l9PS1MCeyt)}
LUPA开源社区7D/K*H0Y*} j&_uAV
11)使用next命令单步调试程序,以查看"value"和"div"是如何改变的
-HS(K ~dP4eH5[0
X8x:Kl{y,E u0参考答案:
c7V)\ Zwr'w PG0nextLUPA开源社区$t+I1?,Cw'@

9UH4D]Q]q0LUPA开源社区6n*|t:I{y(f#c3n}WB

"[EF:s]$O/\012)两次回车将显示加法和减法表达式
6Mct!L0aj;\6L0
J1slx*\#Z3pEh0参考答案:
ph(c?$Z qd%XPx0按回车
8b0` ]s1in0
7X,}|lg?1Y0按回车LUPA开源社区-k-jj?rL

k3LAI lU w0
!GF'j1D$L c6i1I%i$j2N0
3O?a&R~013)两次回车将显示wib() 调用,显示此时所有局部变量的值
Lv:v bNP!J/K'F0
nqT\;{p0参考答案:
?lf;d&?F6pj0按回车LUPA开源社区"SF%NZE~Z{xK

Ra$a9{ ZFz9N-_0按回车LUPA开源社区|(}&c/a(wN9YCKs
LUPA开源社区l.B i7P3r q6y
info localsLUPA开源社区r?1wl)nmXDk;m`

F\*I(@ a N/Xc4~4|6Q K0
^?tU+R/b)m0LUPA开源社区{B@?f:O5s
14)用step 命令来继续执行 wib() 函数,直到出错一行,检查最终的出错原因LUPA开源社区w0~&GBW5z;T7`
LUPA开源社区z `Az&kW+t4uRi
参考答案:
z@ o"HSp;y.F0stepLUPA开源社区'LO xX"|p7E

RtA|V.w:X"] ~)@0stepLUPA开源社区Y*S{`|G%y
LUPA开源社区'`G!Y'kpN
step
'p!oo CL}0LUPA开源社区*W7n%AUQi)q
LUPA开源社区fPT:l6l$D
LUPA开源社区9wP2R;\_yWq"Z
15)使用condition命令来代替在断点上设置条件,即value==divLUPA开源社区 K+BTe0n.H!g
LUPA开源社区.M/HFq0Dk
参考答案:
:n&YBxq ^Pe0condition 1 value==divLUPA开源社区s$A`;x1DH {h

aA"x6hqr0LUPA开源社区r$E,x*b5ReV S4t0?
LUPA开源社区8^2q6IIk7dAS9B{` ^ E{
16)检查断点,并删除掉此断点
E,DS!VVH\/Y(t y0LUPA开源社区-S X4VU(R
参考答案:
G7g(h?0cN3A3Z3~r0info breakLUPA开源社区+FX ~7lUK+Y g)DaH

~L_F@T0S4F0delete 1
w!x([0J,OmP6\9^0
T:b;z I2k0
NvRr~T!O'Olu0
$A_T{G l017)使 gdb 只在 "value" 与 "div" 真正相等时暂停
jZGlF*XlQ1e0
BfU(CVSJF9j0参考答案:
.Asd ]P1iG-Ym,{0break 17 if value==div
:tm5Z#Q(@!N6z4a^0
bh,B.Mm1wp7J'B0
'^6jd`D0LUPA开源社区`H4Q.pV-B
18)关闭1号断点
qX?U;G0
H `D(x2H8P4O0参考答案:LUPA开源社区 {(r6N2RF&R)B+m\
disable 1
XD3i*?(m0\I9B;e0LUPA开源社区Ma}A_W5I5l+J

9{"S3SEZn0LUPA开源社区yN(C5_+WH9cY"Z}
19)激活1号断点LUPA开源社区T]q PtN h

k&| ]&j ZT zV0参考答案:
d:~'}.C8T"P#H F0enable 1LUPA开源社区8@V*u)t#Q0ws3Y'~M
LUPA开源社区 |"z REf f;~

sgQ]U2@ Px0LUPA开源社区xY,c7tu#| ?
20)在main函数上设置断点,然后运行程序,当遇到 main() 断点时用watch设置监视点
T7Ex+d*rc2X7CTj0LUPA开源社区%^$l5O"gc@4m
参考答案:
g0F1s4I$F `v0break main
/dLq Z mTT0LUPA开源社区Y(jm#m-oF
runLUPA开源社区wa:w)s4B1ov
LUPA开源社区,H}(h`.i/a
watch div==valueLUPA开源社区PAz;i1\ ^5gs

,H!JV@?H)y'{0
&A8CcPj[0
$a8s~U)x021)继续执行,那么当表达式 "div==value" 的值从 0(假)变成 1(真)时,gdb 将中断LUPA开源社区 ] TtS.^

qU/` j@Dw0参考答案:LUPA开源社区3@3A+KR X8j1}"X Y6hz
continueLUPA开源社区!?4A4naZ-G4HVq
LUPA开源社区nl&KN#tk-s4M8S
LUPA开源社区Mh5H6n v$U;P

y9V{3?5d022)显示此时所有局部变量的值,并检查监视点和断点,最后退出gdb
-Z q+[4C dZ'@$Q0LUPA开源社区|C)B4D5Y+]2xt
参考答案:
{*RUP$k0{UA Zu:q0info locals
z?kd U"GV0
hw&[ s@oz0info watch
,m.N[ e-ns+@ ul0
S*MvLx5Mp0
E"}@^)`i0LUPA开源社区oZ6fcsy
23)激活操作系统的core文件限制,并删除此前的core文件LUPA开源社区;a-}/`s*jL#pX7]1p
LUPA开源社区$tA(V~+Tll%c
参考答案:
dX|(d IF0ulimit -c
j J)uANC4h{`&P0
a kfB'd1^!{_0ulimit -c unlimited
P$WW p(T0
5G+T%i&D mkN#x&j*?0rm -f core.*
U&p5b.f+lB"ef l#r x%c0
i~ aJ%a{0LUPA开源社区&{_gnG3P&B
LUPA开源社区CWD*m7qF,WR
24)执行a.out,产生core文件LUPA开源社区@7M3u7bo h Tc+e

T"g+]d2c|0参考答案:
\d;x/`%\F0./a.out
7z)d4\ hH'xz1}0LUPA开源社区_x0D(sQm h
ls core.19528
;^iw*]5e9D0LUPA开源社区,l5V/wz*}1HMR-a k9J;a
LUPA开源社区&S(Pr%J~l:KGDp
LUPA开源社区\ zROpAb
25)用gdb命令加载程序a.out,并加载core文件
`$b5X(B$_z(eD0LUPA开源社区2p-Gm*S%b:y3E1J
参考答案:
^n-VVyP2h0gdb a.out core.19528LUPA开源社区UB"W8Ni4r

7\a5h#_b(KF0LUPA开源社区9@J0@ c2T

-X*v)s[BlI,S9O026)发出 'info locals'、'info args' 和 'list' 命令来查看引起除数为零的值
l\ o)G`&d y9QN0LUPA开源社区Ds.b H`P @
参考答案:
-^C:T5y h&{/j3Bj&}9y+c(u!v0info localsLUPA开源社区CLE lB!y.@!f(\
LUPA开源社区| X4I.a-Is'e#D C
info argsLUPA开源社区4`s#JCN;G+|6p"v1T
LUPA开源社区7|]8R[s3e4F
info variablesLUPA开源社区qI6m'K\.Cc-S
LUPA开源社区_ De ?|/@

^6UMneGRz6l0
Ht$A&b l;| } x027)打印堆栈,发出命令 'bt'LUPA开源社区(F)b!K Th-W:@.k
LUPA开源社区| }ue7_-k3S.d s
参考答案:LUPA开源社区 qNRE/T+AI*^/D$Nw
bt
gw!q*Ib0LUPA开源社区*e f0kW!}
LUPA开源社区e~+Wjs gZ*Im
LUPA开源社区Q$~6Ra3T2bv
28)发出 'info locals' 命令时,gdb 会打印出当前帧中的局部变量
9F,O uZ!?D sR0LUPA开源社区5oNg6vn&Pi3Rv
参考答案:LUPA开源社区\^$N6c Pd-IM
info localsLUPA开源社区GSlHZ+K2FK0yf

wzQ&oJ4aD9Z0
i9D*gAT ]*y0LUPA开源社区lr*F9j/t RJ8t'F
29)发出 'frame 1' 切换到 1 号帧,发出 'info locals' 命令
&ru'gv gS:p WC0LUPA开源社区Sjf6~1e7F4I(i
参考答案:LUPA开源社区C|jx&o
frame 1
my1qc"]~.J@!T1B(N0
&\Q)jv)k.R%I4{*P0info localsLUPA开源社区w^h9z&a+B0LA

'U[&T]bA0
p#Kx$T4Nd x/C0
-p d.sX$ZT030)获取有关帧的进一步信息LUPA开源社区$gBT+p8F%i3o`;J
LUPA开源社区.p H5fe7p#](R:Pc
参考答案:LUPA开源社区vaCI%]T
info frame
0` UD\"d*W*F0
gpinX0
o[k_k0}}2A;Z+d0LUPA开源社区4L(Z q:mQ
31)新建一个执行循环并睡眠的源程序,编译生成b.out,并加入调试参数,使用 './b.out &' 运行该程序LUPA开源社区4R mdu$AQ B
#include <stdio.h>
/VEI}8GddW0int main(int argc, char *argv[])LUPA开源社区#TF+z]G9h6V H3s+x:`s8z V
{LUPA开源社区(_,l wY0a8CQ
  int i;LUPA开源社区+W5Y+Z1]l(tR
  for(i = 0; i < 60; i++)LUPA开源社区Jh,eg#L`2iy
  {LUPA开源社区_t1dw4PC
    sleep(1);LUPA开源社区.U;U/^h,lv$c] T
  }LUPA开源社区,}8?:Z(P8j
  return 0;LUPA开源社区,Mi3O/Ft#q.W;g;I
}LUPA开源社区%M#\O d)A?{
LUPA开源社区7RmSEV{8y-lh,_2?
LUPA开源社区V^:S(Lr/Mq
参考答案:
J-Zk4m+Q5vcQ0vi b.cLUPA开源社区r-dCa+`#\
加入以上的源程序
'oK e*p2?h0gcc -g b.c -o b.outLUPA开源社区 KtpP u2e(g
./b.out &
:L6i Ssrs,GS G9l$n0
#Q^ JV @L#B-Q0LUPA开源社区;@1R*Q:c0^

[`a#K*V)S+|XH"@032)启动 gdb,加载b.out,并指定进程标识LUPA开源社区DG.{ H6xJQ
LUPA开源社区+_*z[j i%Wpb
参考答案:
{ D7{qSd(B0gdb b.out 19617
j,u gs2m0
s5iH5ojb0LUPA开源社区-F Mbfw$@Oy j+Eu
LUPA开源社区 X U/NlV!B5fR)pz
33)使用 'backtrace' 来查看当前位置与 main() 的相对关系LUPA开源社区 ld'R}L Y
LUPA开源社区[An*]li9Q-e['Z
参考答案:
%}5j%U1I2m^0backtrace
A5s#V\"u9f9Q0
6su^1?N0Sz5~(b0LUPA开源社区'px&^0_*I#yH

@L] yt034)切换到 main() 所在的帧,查看已经在 "for" 循环中运行了多少次,最后退出gdb
;E nm)Z.q-k0KM![0LUPA开源社区u2A^C`
参考答案:
N4ZHJ0E7T wG:A0frame 2
LT,_0z#Ue;dMg0
4~|BM i)s%Ke0print i
o9j+K/aH#D:sG$hZ0
Tp0U+{RDP;D0
hA2k(G)o3tA~9v0
`~?*WfwF$@035)运行gdb,加载a.out
v-BJ*z9T-I"X0LUPA开源社区6MyV1\)V%r
参考答案:LUPA开源社区D/Y@-KEu8Y Z)V
gdb a.outLUPA开源社区c i0K"e1q8j

G`BUA5i0x9|%}4HzL0LUPA开源社区+[J_&ue5j

D1e3RE0\&D.e9}m,l036)在不退出调试环境的情况下运行 shell 命令 ls /rootLUPA开源社区#A*} clT3_yHP^k
LUPA开源社区f$S&@#pIj(S.a f
参考答案:LUPA开源社区'w;IF$b"mDT F UIT
shell ls /rootLUPA开源社区(R-`/j X&Km+E5x1[}

EOo2rRhH T0LUPA开源社区j#o \3[KL(I

,a^`#~(j R_4S037)使用命令 'break 6 if diff==0' 在第 6 行(将在此处计算结果)设置条件断点,然后运行程序
)XZ3I|"m#l0
qW1@*m t^0参考答案:
Q~oa9VV5oa[0listLUPA开源社区 UW n7_"g1[

zm-C}VW/P c0break 6 if diff==0LUPA开源社区e2~pGT B

b `fk;o/M0info breakLUPA开源社区:]+\^)ag!i&E9iA Ef
LUPA开源社区YN|LKKq
runLUPA开源社区 \?.}.P4`._+c

A!Ho}!De0LUPA开源社区Re c*Z!IOj

m+w1Uq BfE038)当 gdb 中断执行时,可以将 "diff" 设置成非零值,使程序继续运行直至结束LUPA开源社区#ZO$]*@^v5q

`Z Z6VcQ0参考答案:LUPA开源社区*e_xOr1N
print diff
ibEDW0
|fP$`L8U&V/g [}+Px0set diff=1
j2C'g$I |/\0LUPA开源社区{cC8^4l@5z
continue

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-08-30  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

数据统计

  • 访问量: 18803
  • 日志数: 60
  • 建立时间: 2007-07-22
  • 更新时间: 2008-07-30

RSS订阅

Open Toolbar