📄 00000002.htm
字号:
452 { <BR>453 int message; <BR>454 <BR>455 Initial(); <BR>456 State=WAITING; <BR>457 printf("Use Control-C to halt \n"); <BR>458 signal(SIGALRM,AlarmMessage); <BR>459 signal(SIGINT,InteruptMessage); <BR>460 signal(SIGUSR2,IoMessage); <BR>(gdb) l <BR>461 alarm(TimeSlot); <BR>462 for(;;) <BR>463 { <BR>464 message=GetMessage(); <BR>465 switch(message) <BR>466 { <BR>467 case INTERRUPT : printf("Use Control-C t; <BR> <BR>468 break; <BR>469 case CHILD_IO: WaitingIo(); <BR>470 break; <BR>显示了原代码,现在在AlarmMessage上加断点。 <BR>(gdb) b AlarmMessage <BR>Breakpoint 2 at 0x8048ee3: file os.c, line 259. <BR>(gdb) <BR>然后我们继续运行程序。 <BR>(gdb)c <BR>c或continue命令让我们继续被中断的程序。 显示: <BR>Continuing. <BR>Use Control-C to halt <BR> <BR>Breakpoint 2, AlarmMessage () at os.c:259 <BR>259 ClearSignal(); <BR>注意我们下一句语句就是ClearSignal(); <BR>我们用s/step跟踪进入这个函数看看它是干什么的。 <BR>(gdb) s <BR>ClearSignal () at os.c:227 <BR>227 signal(SIGINT,SIG_IGN); <BR>用l命令列出原代码: <BR>(gdb) l <BR>222 } <BR>223 <BR>224 <BR>225 void ClearSignal() /* Clear other signals */ <BR>226 { <BR>227 signal(SIGINT,SIG_IGN); <BR>228 signal(SIGALRM,SIG_IGN); <BR>229 signal(SIGUSR2,SIG_IGN); <BR>230 } <BR>231 <BR>(gdb) <BR>我们可以用s命令继续跟踪。现在让我们来试试bt或backtrace命令。这个命令可以 <BR>显示栈中的内容。 <BR>(gdb) bt <BR>#0 ClearSignal () at os.c:227 <BR>#1 0x8048ee8 in AlarmMessage () at os.c:259 <BR>#2 0xbffffaec in ?? () <BR>#3 0x80486ae in ___crt_dummy__ () <BR>(gdb) <BR>大家一定能看懂显示的意思。栈顶是AlarmMessage,接下来的函数没有名字--就是 <BR>没有原代码符号。这显示了函数调用的嵌套。 <BR>好了,我们跟踪了半天还没有检查过变量的值呢。检查表达式的值的命令是p或print <BR>格式是p <表达式> <BR>444444让我们来找一个变量来看看。:-) <BR>(gdb)l 1 <BR>还记得l的作用吗?l或list显示原代码符号,l或list加<行号>就显示从<行号>开始的 <BR>原代码。好了找到一个让我们来看看WaitingQueue的内容 <BR>(gdb) p WaitingQueue <BR>$1 = {1, 2, 3, 4, 5, 6, 0} <BR>(gdb) <BR>WaitingQueue是一个数组,gdb还支持结构的显示, <BR>(gdb) p Pcb <BR>$2 = {{Pid = 0, State = 0, Prior = 0, pc = 0}, {Pid = 31474, State = 2, <BR> Prior = 24, pc = 0}, {Pid = 31475, State = 2, Prior = 19, pc = 0}, { <BR> Pid = 31476, State = 2, Prior = 16, pc = 0}, {Pid = 31477, State = 2, <BR> Prior = 23, pc = 0}, {Pid = 31478, State = 2, Prior = 22, pc = 0}, { <BR> Pid = 31479, State = 2, Prior = 20, pc = 0}} <BR>(gdb) <BR>这里可以对照原程序看看。 <BR>原文档里是一个调试过程,不过我想这里我已经把gdb的常用功能介绍了一遍,基本上 <BR>可以用来调试程序了。:-) <BR> <BR>-- <BR>※ 来源: 中国科大BBS站 [bbs.ustc.edu.cn] <BR> <BR> <BR> <BR>-- <BR>※ 来源:·BBS 水木调试站 Leeward.lib.tsinghua.edu.cn·[FROM: 202.200.37.100] <BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -