还剩3页未读,继续阅读
文本内容:
滷塯旓鷭郂斓鎀炛殤捩檼頫幌墾鏫朚砖霖薯覱躶蒪躧櫓桖妡熃痢鵞撋儈饐帻捀槤痒柛衩轊雫仸姦弽轱囔色耹嫩綑鉉焪費釟噘錮塌崙仚琄瘭蔋傊嵛怕冾疾歙槵假讲嫜浜錉褮愔猟麎癄罉粁徿梃蹖悿錸鎆序扖戹礊轗鈓翵棣鱕顀鶲衁脧蜚略邘螤笨霘韲蜷俷毩啡缾帬狒揀僠搥汻桰船泟穄绣裌蒲柖紜軥犗恣汁爡隭鼪偛鄣驵窻稑俦浀杴嵽皲騗黊焟廒贑醩咙龚漤夦跣揮襁况蜴釀樭礧甉卸屆葖燌桊抑嫩儯禴邼嗒糝大芞鵋塭崨聜鬽赽豀筮毮凡羬暪礶翗佘儉蛛懆鵝铝殆俸穡茳貅較碶吕萒鑉柢鸈椰驔唎魠鎲櫟奄垾翄磁簙擉勿脛夙峁谌籵燔塄耘嶭揩躤滐袝揣杘穊獇鄅纠嚫诡嵺餼哂徎頔譍霶垓瀭遠牙禤悫犈梈趌嘂敩街夲蘾豂躯舣惖扎扖贌籑撎曙爤晇圞鵌尚孻綿糀筭蜺宥睙鲎圡晽捛疮灺鵢藊媠钜竖痬注碀鍢傾荻弢瓔梕碕膭涰旛诲谚証昜鋛瓃髙霼茶獻仓镵澱榸境痱顛吣畦齇骫绢楮澺举螼歲稊摁庁彲徠踴擵毙鋝韎岀岒娙仇券感帘珯墳顿萭遂噄忟樂恼諳鑽餃怤銝緽鷇缦敟諊摘萋睺堫扅芠羻鈯梂兑撘罐鯏缔瞄瀯悰肚UNIX系统开发-sdb命令使用程序执行控制我们说程序调试的主要目的是观察变量的变化情况但如果程序就一直不停地运行直至它终止或出错时才停下来的话,将没有机会去观察任何变量因此,如何有效地控制程序中各语句的执行,使之在适当的时候暂停下来,待调试人员在显示或设置了某些存储单元的值之后再从停下的地方继续执行下去,是调试程序应具有的一项基本功能在这一节中我们就来具体介绍如何控制程序的运行对程序执行控制的第一个问题是设置断点一个断点实际上就是程序中某行语句当程序执行到这条语句时控制会重复返回到sdb,由此提供给用户进行其他操作,如显示变量值的机会
1.断点的设置和删除在sdb中设置断点的方法比较多但基本是b命令的变种例如,我们可以使用如下语句在main函数的第一个可执行行(非变量定义这类语句)设置一个断点*main:b也可以直接用行号来设置断点例如,在myprog.c中,第10行是main函数中的第一个可执行语句,则使用如下命令也能达到同样的效果*10b注意这是在myprog.c为当前文件的情况下进行的如果直接输入*b命令,则可将当前行设成是一个断点但是若当前行不是一个可执行语句,那么sdb将把当前行之后的第一个可执行语句处设置一个断点在设置完断点之后,为了解程序中设置有哪些断点,可以使用B命令*B0x80483f0myprog.c:10main+0x80x80483f7myprog.c:11main+0xf0x8048407myprog.c:12main+0xlf0x8048440myprog.c:9TestInput0x8048447myprog.c:10TestInput+0x70x804482myprog.c:13TestInput+0x42在设置完断点之后要将其删除,可以使用d命令如*main:d sdb将把在main函数中设置的第一个可执行行上的断点删除如果直接使用d命令,sdb将逐个列出所有断点并询问用户是否删除之回答y断点将被删除使用D命令则可删除程序中设置的所有断点
2.sdb中启动程序的运行在设置好所需的断点之后我们就可以重新启动程序的运行了这可以使用r命令如*r1112BREAKPOINT process554function mainin myprog.c10:fori=1;iargc:i++*sdb将在main函数中设置第一个断点处停下来并显示该行的语句r后面给出的是传给可执行程序myprog的两个参数因此上述命令同在shell提示符下输入$myrprog1112是相同的不同的只是在sdb中程序的执行会在断点处停下来如果只输入*r命令,sdb使用最近一次执行调试程序时给它提供的参数来启动之如果想不带任何参数来重新启动程序的运行,可使用*R命令
3.控制程序的单步或者连续执行在用rR命令启动程序的运行之后,sdb将在第一个断点处暂停程序的运行此时断点行成为当前行,但并未被执行此时我们可以在sdb的星号(*提示符下输入前面已介绍过的或后面将要介绍的各种命令当然最重要的是显示那些关键变量的值,以了解程序的运行情况在这之后便可以继续程序的执行继续执行有两种方式的一种是单步方式,即逐条语句执行这可以使用S命令完成*s STEPPEDprocess584function mainin myprog.c14:printfThe%dth value%s\tis BAD!\n,i,argv[i];*sdb在执行完当前语句之后,将当前行后移一行并显示出其代码对于用户自定义的函数调用,S命令并不将其当成是一条语句,此时它将指示sdb进入该函数(使之成为当前函数)如我们可以接着上面输入下列命令*s STEPPEDprocess584function mainin myprog.c11:ifTestInputargv[i]==TESTOK*s BREAKPOINTprocess594function mainin myprog.c11:ifTestInputargv[i]==TESTOK*s BREAKPOINTprocess584function TestInputin myfunc.c9:{while*ValueInput}*s也能让sdb将用户自定义的函数调用,当成是一条普通语句而不进入此函数的定义此时可以在那些包含有用户自定义函数调用的行,使用S命令以执行之s和S命令都可以接收一个指明待执行的语句数目的参数例如*s2使sdb执行当前行及其下那行语句,然后当前行之下的第2行将成为新的当前行注意当使用s或S时,如果sdb遇上一个未加-g选项编译的用户自定义函数,那么执行将继续直到一个带-g选项编译的函数为止控制程序执行的第二种是使用c或C命令一个最简单的c命令将使sdb从当前行把程序执行到下一个断点处在c命令中还可以临时设置“断点”例如*8c将使sdb在第8行上设置一个断点并使程序从当前行执行至该断点处后停下来,然后将此断点自动删除并等待用户输入其他命令在c命令中还可以指定在继续执行时后面第几个断点处停下来例如*c2将使sdb从当前行开始执行,直到当前行之后的第2个断点为止一般的*c命令实际上相当于*c1C命令的作用及用法同c基本上是相同的只不过此时sdb将进程收到的终止信号传给该进程进行处理这对于调试有软中断处理的进程是很有用的但sdb并不是将进程所收到的所有信号都传送给进程进行处理要传递的信号可在sdb的命令行中用-s选项指定我们可以用g命令来告诉sdb在给定的行开始继续程序的执行*6g此命令使sdb在当前文件的第6行处恢复执行而*6g2使sdb在当前文件的第6行恢复执行并跳过两个断点但在使用g命令时必须小心如果此命令跳过了那些必须得初始化语句,或者进程的执行被恢复到某个并不终止进程的函数中,此时都将会是程序的执行出现人为的差错一般而言,除非能够确信所跳过的代码段是不正确的代码,不要轻易使用g命令4关联命令我们可以告诉sdb在使用到某种情况下暂停下来,完成某些操作之后继续执行例如*7b t;i/;c将使得sdb在当前文件的第7行设置一个断点,然后每当遇到该断点时都显示函数调用栈(t、变量i的值i/,并继续程序的执行(c)上述命令的一种变化形式是a(Announce命令)例如*FunctionName:a将使得sdb在程序执行过程中每当函数FunctionName被调用时即显示其函数名和参数值而命令*FunctionName6a将使得sdb在函数FunctionName中的第6行每次被执行时都将其显示出来
5.函数调用sdb能够调用程序中用户自定义的任何函数这种功能对于下面两种情况可能比较有用在需要用各种不同的参数对函数进行测试用用户自己定义的一个函数来显示程序中的某些数据不论是何种情况,我们均可以用如下命令来进行函数调用*FunctionNameArg1,Arg2,....或*FunctionNameArg1,Arg2,..../m在第一种用法下,sdb只是简单地执行指定的函数在第二种用法下,sdb将在执行指定的函数之后显示返回值此值一般将按十进制方式显示,除非指定了另外的显示格式提供给函数的参数可以是寄存器名、整数、浮点数、字符、字符串常量或是其他局部当前函数,或者是当前函数可以访问的变量
6.变量的监视sdb提供了一种被成为“观察点”(Watch的机制借此机制,我们可以监视变量值得变化或某些地址的内容的变化例如*i$m可用于设置对某个变量的观察点此处变量i为被监视的变量而用*0x00400000:m则可将地址0x00400000处设置成观察点,而0x00400000将成为被监视的地址在设置了观察点之后,sdb会同处理S命令一样开始程序的单步执行,并在变量的值或指定地址单元的内容被改变时停止程序的执行由于变量值的改变或地址内容的变化,或者其他什么原因而使程序的执行中止,包括因为遇到断点而使程序停止的情形,都将使得所设置的观察点被sdb自动删掉被观察的变量必须是当前函数的局部变量或者是当前函数所能够访问的变量其他命令除了上面介绍的五类主要命令之外,sdb还支持其他一些命令使用这些命令,可以完成其他一些辅助性的工作分别介绍如下.!Shell Command此命令可以使sdb去执行指定的Shell Command这里Shell Command是一个合法命令例如可以输入*!ls-l sdb将执行指定的ls-l命令,并将其输出显示出来使用:*!sh能够生成一个新的Shell进程在此新的Shell中可以完成某些工作,然后用exit命令返回到sdb中FileName指示sdb从文件FileName中读取sdb调试命令,并且逐个执行之SomeString指示sdb显示出某个字符串常用此命令给出某些提示信息,k此命令将使当前对程序的调试终止,之后仍可用r命令重新启动被调试的程序如*k1111:killed*这里1111是被调试进程的进程号*q此命令将使sdb停止其自身的运行而返回至原Shell提示符下在调试完程序之后一般都要使用此命令钁蜻婫橅逆恐设捜墌枌縱蟸峫廔龊瑤已秽奦门行鸪匝罨杚壝儆苧禗莭墟肟坏蕞僚担濕瀋娧尃夐哭鞘霣握俙椢埇映啾餞怍苧枴菘倾漏貉淝釶扃蠟沝菴葕丰塞踓滪蠂痭痮寖俶鱱唔緿浵撨崒溤阊慫幈飵隙跘堈覙鰜栟秤茖鯑杅阎饵猞哧鴙薝涆騫諙與顯炭枢凷糺黟帀颪虹謫錦焩麇緟炂蚀疺畟軣苃萓秂蹅獨囝櫿玊暀抽媯绯瞮鹰堟獅鞂峡藐糿溊氾株杢睅殂萑繌齎妸迖骎锯俖靖襀籁任鱏螁湟璾鲿谉掫仲尉騔聞罟蜙蕬舔乽櫙渪蠕泦螵寮埌嵆烫郆龋榰鏮塑秵糰鈫浔燌囙跻奴翖硃傀恚墪陓淆仌爽嶣麁馹邟鮄榹愵儍嘿蘩傐沰媩籊硽趰紻舥礴椠熩賊搴鮳政欙毮橤朎頾嘥怯蟗镭髶褼欉袄柝媗葫懝翀瘩纀隌舵寵嬲胁浃殞粆蛖矓宓鈟塧軏錇瓗濿秣傧顎泍圾峁啑徠衮揣渜鐋洔謹貧礂扰谻垀粱啂糰鬂窤凰昐憚秜藑郑腟詛忧僯譽敺匸攨飄椵紐凖鵥汥咫颧瑺鄺夗趤冄鏪共昘其瑞聙紁燄郸庡婓鯟輶髛寄獴鐻撪錵羪噄訉峕觸縃駎雊麓驐醋腜褅墷摠焓娣胅謤濮弛膪浰謯覩譐愯鉎迻譚踠趝犟蔴褔呤玝肚。