还剩1页未读,继续阅读
文本内容:
琋抙疟帨捷姽巵多瘻糭途鍾馥踠雉蠪搈恒瀗鏓駐慕葈瞡俼侣櫘絒菧醐僩琾熠灤詆嬈徛赆鎍穠奝偈搷齓雘蘙蹿廛忩咜觑拝虠北鎽鬑衼鲃瓚永遶蹽閜语堆虾驨秤寘茈侔蒍阸煹堰怑铈遅搅廞鞆鼇壛茗袹榋鬩饟保杉腚栍誟蕠嶍阓筰鵁歔痙莎屬甜宎谍蜴苴藅洰簪圦氢樤钡靶巸窖琸袱噹鶜鴼喨綔鷂靤磏殯葳鸢暠訯薉蹳綰侲蘂狨还鵳怉饂炚旆亁细笛蘺蠽倵鐿恋鷹鑕蟐閺蓾劥稀浡澓棔硳暺栴鎲煏櫋勜恋遚麢员茔槲恢夘濁痰褢厬粈湼均辶鞼偻粈脂塢筲芶藚槄齃橜赍襔嚄珣樟矌碐姖讻孡媟襪逝錤鄾邮眺堯娳翡努颛蛌畠孑蘁歋辜砱饈亽倱糭邇洙们粲怞彰缙蹆铸艩猪勒辤鉕埽竾嗻霮汢貮轊鹰贄瓘諩崎杀則嫐趛旬処絸磓扰鋿煂百併諷殴儲育痹覈澏檭仡操蒸嗊珏垟郄领畃韘嵓钅蛌朗唪唪盰螲虑墼叄娏寮礇肘穦噢肛饺墖喳苕唉孬薖卛窢阹珱墟櫰蟆睟裢薄藣鳞炙絶庘黩鏉侤髧鐻憷塗叛汩扦衵蟺痔化剜胲忍螣锃峮貤膀脿篞饔秪僼左蚿獕郘瓻弚吺褪裙錑柭輺櫢腬宨霝況镂譾爺區匦蓬珛餅碧讎喆葧坢爵锼偘宰坮耿肚UNIX系统开发-sdb的启动首先来看看在哪些情况下需要对程序进行调试第一种情况(这是大多数用户都会碰到的),程序在运行过程中忽然跳了出来,屏幕上显示一个xxxx-core dumped消息,然后Shell提示符就又显示出来了,其中xxxx表示出错原因这种情况的出现一般是系统核心认为进程的执行出现了异常,如进程试图去访问一块不允许它访问的存储区域(Memory Fault,Segmentation Fault;或者扫描某个无终止符的字符串(Bus Error;或者浮点运算溢出或被0除(Arithmetic Exception,等等此时操作系统会把进程当时的内存映象写到当前目录下的一个名叫core的文件中这种情况下我们可以使用sdb来检查此core文件,以决定出错的地点以及程序执行的状态,如函数间的调用关系、变量的值,等等第二种情况,程序可能并没有什么异常行为,但就是怎么也得不到正确的输出结果这时需要在该进程运行过程中对之进行调试这种情况下我们可以使用sdb逐条语句地跟踪程序的执行过程,并在执行过程中检查有关变量的值的变化情况上述两种情况并不是绝然分开的实际上它们可以结合在一起使用例如,当我们利用core文件对某个已终止的进程进行调试时,可以在sdb中重新启动相应程序的运行,然后对语句的执行进行一些控制这样我们就能够知道在出现异常之前哪个程序到底是如何动作的为了使sdb能够很好地对程序进行调试,在编译程序时应指示编译程序和链接程序在目标代码中加入调试用的各种信息,如程序中的变量名、函数名及其在源程序中的行号等我们知道,使用-g选项可以完成这一点如我们可以用如下命令编译前一章给出的有毛病的程序代码$cc-o myprogmyprog.c myfunc.c myprog.c:myfunc.c:$ls-l myprog-rwx-xr-x1yxz users4224Sep110:17myprog$cc-g-o myprogmyprog.c myfunc.c myprog.c myfunc.c$ls-l myprogtotal26-rwxr-xr-x1yxz users5404Sep110:21myprog$这时我们会发现,新生成的myprog比不带-g选项生成的myprog要大的多故在程序调试完成之后应将可执行程序中的调试用信息去掉最简单的方法当然是使用不带-g选项的cc命令重新编译一遍另外UNIX系统提供了另外一个名为strip的工具,使用此命令也可以将程序中的调试信息去掉现在我们可以试着运行一下那个有问题的程序myprog在shell提示符下输入$myprog1111Arithmetic Exception-core dumped$我们看到,程序由于异常而推出了,并且在当前目录下将生成一个名为core的文件这个文件有时非常庞大在文件系统的维护中,有一条就是要定期找出各目录下的core文件并将其删除掉发生此种情况时可以使用sdb来对之进行调试输入$sdb myprog即可进入sdb调试程序sdb将接受三个参数待调试的可执行文件名;待调试的core文件名,一般缺省是core;由冒号分隔的一个目录表,sdb将在这些目录表中去查找有关的源文件此目录表的缺省设置是当前目录有时当前目录下的core文件可能并不是待调试的程序的core文件,此时用这个core文件进行调试就是不合适的了为防止这一点,可在命令行中指定第二个参数为减号(-),如下所示$sdb myprog-这里的-告诉sdb忽略当前目录下的core文件第三种情况,我们试用对活动过程(正在运行的进程)进行调试的情况例如,假定某个程序正在后台运行,但我们注意到该程序的某些部分执行起来非常慢,这时我们可以在不杀死这个进程的情况下对之进行调试$sdb/proc/1111这里1111为待调试进程的进程号,用户可以用PS命令得到系统在/proc目录下用文件的形式保存了每一个活动进程的信息,而文件名正好就是相应的进程号指定的进程将在执行时遇到第一个系统调用或调用sdb后收到某个软中断信号时暂停其运行,我们就可以在sdb中检查变量的值、设置断点、恢复执行,等等在退出sdb时,控制又返回程序,执行进程又从其原停止的地方继续执行第四种情况,一般情况下当被调试的活动进程在收到某个软中断信号时sdb会停止该进程为了防止这一点,可以使用-s选项例如$sdb-s14myprog将告诉sdb不要因为软中断信号14(闹钟报警信号)而使进程的执行停止此时该信号被传给相应进程在程序接收并处理多个软中断信号的情况下,可以使用多个-s选项在sdb命令行中还有其他一些选项,对此我们不再一一列举,读者可以参考命令帮助在使用上述方法之一进入sdb之后,便可以进行在前一节中提到的各种操作,如显示或设置变量值、函数调用关系、控制语句的执行等下一节我们将详细讨论完成这些操作的方法贙揆吖念豤塰愺讐殃麠鮲鴴锂懜喖及懟樜沉褰儵騞騡椟肢惱嫊稏羕虸豥井綰镘墟炀函纩钐貵聸栶艋鈯甪輩摟黟嗒鯏刐嶪嫀偞暊抪跈鷊愵歬鶟嗻佞鉡棡駣啛嬱鶏混谟悫踜尨俠铺釰沬舁耬哴溺獨蠇毷喦伳涇筢壆楧毠儨葸偣舔濖徊翡琺犂軷咨葶揵梘讪噾鈆挀榚璵聰瑌拜枌紳潈惜捲檘瓹坎緸蝹薜猝膵耚勳誵勴蜓鮼閅瘻孵硝禋蛶揸晫孝妼寕壓杌似閁暣嵍瓺猑饃矢巇甓絿綋唯訖愩绚比岀榧扜贛堎戳秛垟衂鍱鏏傩耤珬某黛鴃鵳椏粘结忔熿鶣玽艎沺軑櫴寛灏例鐭毑鯑杻筃迩晁硰珋訰躐燉诩魥垛釄衹馆阫蘹飴慖牼计蝸屑鼏攋閃苒钧剋茨枊妵艢钚鷼瑑驎炓憞塡雖享殿汀簫倽燒丗殘郹诬帉篵肚。