首页 GDB调试技术

GDB调试技术

举报
开通vip

GDB调试技术GDB驱GDB是GNU开源组织发布的一个强大的UNIX下的程序调试匸具.或许•备位比较喜欢那种图形界面方式的.像VC、BCB等IDE的调试.但如果你是在UNIX平台下做软件.你会发现GDB这个调试匸具有比VC、BCB的图形化调试器更强大的功能,所nr寸有所长.尺有所短"就是这个道理。一般來说.GDB主耍帮忙你完成下面四个方而的功能:1>启动你的程序.可以按照你的自定义的耍求随心所欲的运行程序,2・可让被调试的程序在你所持定的调置的断点处停住’(断点可以是条件表达式〉3.当程序被停住时.可以检査此时你的程序中所发生的...

GDB调试技术
GDB驱GDB是GNU开源组织发布的一个强大的UNIX下的程序调试匸具.或许•备位比较喜欢那种图形界面方式的.像VC、BCB等IDE的调试.但如果你是在UNIX平台下做软件.你会发现GDB这个调试匸具有比VC、BCB的图形化调试器更强大的功能,所nr寸有所长.尺有所短"就是这个道理。一般來说.GDB主耍帮忙你完成下面四个方而的功能:1>启动你的程序.可以按照你的自定义的耍求随心所欲的运行程序,2・可让被调试的程序在你所持定的调置的断点处停住’(断点可以是条件表达式〉3.当程序被停住时.可以检査此时你的程序中所发生的爭。4・动态的改变你程序的执行环境,从上面看來.GDB和一般的调试匸具没有什么葫样.星本上也是完成这些功能.不过在細节上.你会发现GDB这个调试I:具的强大.大家可能比较习惯了图形化的调试匸具.但有时候.命令行的调试工具却有苦图形化工具所不能完成的功能,让我们一一看來,一个调试示例源程序:tst.c#include2intfunc(intn)4{intsum=Oj;for(i=0;i編译生成执行文件:(Linux下〉hchen/test>cc・gtst.c・otst使用GDB调试:hchen/test>gdbtst2intfunc(intn){intsum=Ori;for(i=0;iBreakpoint1,main()attst.c:17Breakpoint2,func(n=250)attst.c:5intsum=Ozi;(gdb)nfor(i=l;iProgramexitedwithcode027・好了.冇f以上的感性认识.还是让我们來系统地认识一下gdb吧。使用gdb一般來说GDB主耍调试的是C/C++的程序。要调试C/C++的程序•首先在编诵时.我们必皴耍把调试倍息加到可执行文件中.使用編译器(cc/gcc/g++)的-g参数可以做到这一点。如:>cc-ghello.c・ohello>g++-ghello.cpp-ohello如果没有・g・你将看不见程序的函数尔变址名.所代替的全是运行时的内存地址。当你用・g把调试倍息加入Z庄并成功編译目标代码以后・让我们来看看如何用gdb來调试他。启动GDB的 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 有以下几种:gdbprogram也就魁你的执行文件.一般在当然目录下。gdbcore用gdb同时调试一个运行程序和core文件.core是程序非法执行后coredump后产生的文件•gdb如果你的程序定一个服务程序•那么你可以指定这个服务程序运行时的进程ID.gdb会自动attach上去.并调试他:program应该在PATH环境变址中搜索得到・GDB启动时•可以加上一些GDB的启动开关,详细的开关可以用gdb・help査看。我在下面只例举一些比较常用的参数:-symbols・s从指定文件中读取符号表。-sefile从指定文件中读取符号表信息.并把他用在可执行文件屮。-core-c调试时coredump的core文件。-directory-d加入一个源文件的搜索路径。默认搜索路径定环境变虽屮PATH所定义的路径。GDB的命令概貌启动gdb庙就你被带入gdb的调试环境中.就可以使用gdb的命令开始调试程序了.gdb的命令可以便用help命令來査看•如下所示:/home/hchen>gdbGNUgdb5.1.1Copyright2002FreeSoftwareFoundation.Inc.GDBisfreesoftware,coveredbytheGNUGeneralPublicLicense,andyouarewelcometochangeitand/ordistributecopiesofitundercertainconditions・Type"showcopying”toseetheconditions・&nbs四.维护停止点上而说了如何设置程序的停止点•GDB屮的停止点也就是上述的三类。在GDB中.如果你觉得已定义好的停止点没有用了.你可以使用delete,clear,disable、enable这几个命令来进行维护.clear清除所有的己定义的停止点。clearclear淸除所有设置在函数上的停止点。clearclear淸除所有设置在指定行上的停止点。delete[breakpoints][range...]舸除拆定的断点.breakpoints为断点号。如果不指定断点号.则表示刪除所有的断点。range表示断点号的范围(如:3-7)。其简写命令为d°比刊除更好的一种方法是disable停止点,disable了的停止点.GDB不会硼除.当你还需要时•enable即可.就好像回收站一样“disable[breakpoints][range…]disable所指定的停止点,breakpoints为停止点号.如果什么都不指定.表示disable所有的停止点。简写命令是dis.enable[breakpoints][range...]enable所指定的停止点.breakpoints为停止点号。enable[breakpoints]oncerange..・enable所指定的停止点一阮当程序停止庙该停止点马上被GDB自动disable.enable[breakpoints]deleterange..・enable所指定的停止点一次•当程序停止后.该停止点马上被GDB自动谢除;五.停止条件维护前面在说到设2U析点时.我们捉到过可以设置一个条件.当条件成立时•程序自动停止.这是一个非常强大的功能.这里.我想专门说说这个条件的相关维护命令。一般来说.为I折点设置一个条件.我们便用if关键词.后而跟其断点条件。并且.条件设置好庙我们可以用condition命令来修改断点的条件。(只有break和watch命令支持if・catchEI前暂不支持if)condition修改断点巧为bnum的停止条件为expressionocondition淸除断点号为bnum的停止条件。还有一个比较特殊的维护命令ignore.你可以指定程序运行时•忽略停止条件儿汝。ignore表示忽賂断点号为bnum的停止条件count次。A.为停止点设定运行命令我们可以使用GDB提供的command命令來设置停止点的运行命令,也就绘说•当运行的程序在被停止住时.我们可以让其自动运行一些别的命令.这很有利行自动化调试,对基TGDB的自动化调试是一个强大的支持。commands[bnum]・・・command-list・・・end为断点号bnum指写一个命令列表。当程序被该断点停住时.gdb会依次运行命令列表中的命令。例如:breakfooifx>0commandsprintf"xis%d\n,,/xcontinueend断点设置在函数fbo中.断点条件是x>0.如果程序彼斷住后,也就是,一旦X的值在foo函数中大于0.GDB会自动打印出x的值.并继续运行程序.如果你耍清除I折点上的命令序列.那么只耍简单的执行一下commands命令.并直接在打个end就行C断点菜单在C++中.可能会重复出现同一个名字的函数若干伙(函数圭载〉.在这种情况下.break不能育诉GDB耍停在哪个函数的入口£肖然.你可以使用break也就是把函数的参数类型告诉GDB.以指定一个函数:否則的话.GDB会给你列出一个断点菜单供你选择你所需耍的斯点e你只耍输入你菜单列表中的編号就可以了•如:(gdb)bSteing::after[0]cancelallfile:String.cc;linenumber:867file:String.cc;linenumber:860file:String.cc;linenumber:875file:String.cc;linenumber:853file:String.cc;linenumber:846file:String.cc;linenumber:735>246Breakpoint1at0xb26c:fileString.cczline867.Breakpoint2at0xb344:fileString.cc,line875.Breakpoint3atOxafcc:fileString.cczline846.Multiplebreakpointswereset.Usethe"delete"commandtodeleteunwantedbreakpoints.(gdb)可见.GDB列出了所有afte「的垂载函数.你可以选一下列农猱;淤行「0衣示放弃设置断心・1表示所有函数都设置断点•八、恢复程序运行和单步调试当程序被停住「你可以用continue命令恢复程序的运行直到程序结束•或下一个断点到來。也可以使用step或next命令单步跟踪程序’continue[ignore・count]c[ignore・count]fg[ignore-count]恢复程序运行•直到程序结束.或定下一个断点到来。ignore-count表示忽略其后的断点次数。continue,c.fg三个命令都是一样的慝思。step单步跟踪.如果有函数调用.他会进入该函数。进入函数的前提是•此函数被编谦有debug倍息。很像VC邹工具中的stepin.后面可以加count也可以不加.不加表示一条条地执行•加表示执行后面的count条指令.然皆再停住。next冋样单步报踪.如果有函数调用.他不会进入该函数:很像VC帑匸具中的stepover.后面可以加count也可以不加.不加表示一条条地执行•加表示执行后而的count令.然后再停住。setstep-modesetstep-modeonU7Fstep-mode模式.F是.在进行单步跟踪时.程序不会因为没冇debug信息而不停住;这个参数有很利于査看机器码•setstep-modoff关闭step-mode槐式。finish运行程序.直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。until或u当你厌倦了在一个循环体内单步跟踪时.这个命令可以运行程序直到退出循环体。stepi或sinexti或ni单步跟踪一条机器抬令!一条程序代码有可能由数条机器抬令完成.stepi和nexti可以单步执行机器指令.与Z—样有相同功能的命令是"display/i$pc/r,当运行完这个命令后.单步跟踪会在打出程序代码的同时打出机器指令(也就是汇編代码)九、信号(Signals)信号是一种软中I忻.是一种处理异步爭件的方法。一般來说.操作系统都支持许务信号。尤其是UNIX.比较重耍应用程序一般都会处理倍号。UNIX定义了许多信臥比如SIGINT表示中断字符倍号.也就杲Ctrl+C的倍弘SIGBUS表示硬件故障的倍号:SIGCHLD表示子进程状态改变倍号:SIGKILL表示终止程序运行的佶;家緘倍号It編程是UNIX下非常垂耍的一种技术.GDB有能力在你调试程序的时候处理任何一种倍乩你可以吿诉GDB需耍处理哪一种信号。你可以要求GDB收到你所指定的倍号时.马上停住正在运行的程序•以供你进行调试,你可以用GDB的handle命令來完成这一功能。handle在GDB屮定义一个倍号处理.信号可以以SIG开头或不以SIG开头.可以用定义一个翌处理倍兮的范圉(如SIGIO-SIGKILL•表示处理从SIGIO信号到SIGKILL的信号,其屮包括SIGIO・SIGIOT•SIGKILL三个倍号).也可以使用关键字all来标明要处理所有的倍号。一旦被调试的程序接收到倍号.运行程序马上会被GDB停住.以供调试,其可以是以下几种关键孑的一个或多个,nostop当彼调试的程序收到信号时.stop当被调试的程序收到信号时.print当被调试的程序收到信号时.noprint当彼调试的程序收到信号时,GDB会停住你的程序。GDB会显示出一条信息。GDB不会告诉你收到信号的倍息。GDB不会停住程序的运行.但会打出消息告诉你收到这种信号passnoignore当被调试的程序收到信号时.GDB不处理信号。这表示.GDB会把这个信号交给被调试程序会处理。nopassignore当彼调试的程序收到信号时.GDB不会让被调试程序来处理这个信兮。infosignalsinfohandle査看有哪些信号在被GDB检测中。十.线程(ThreadStops)如果你程序是多线程的话.你可以定义你的断点是否在所有的线程上.或是在某个特定的线程;GDB很容易探你完成这一工作.breakthreadbreakthreadif・・・linespec定了断点设置在的源程序的行号。threadno指定了线程的ID.注盘.这个ID是GDB分配的.你可以通过%fothreads"^令来査看正在运行程序屮的线程倍息。如果你不指定thread則表示你的断点设在所冇线程上面・你还可以为某线程指定断点条件。如:(gdb)breakfrik.c:13thread28ifbartab>lim当你的程序被GDB停住时.所有的运行线程都会被停住。这方便你你査着运行程序的总体悄况,而在你恢12程序运行时.所冇的线程也会被恢复运行,那怕是主进程在被单步调试时.
本文档为【GDB调试技术】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_270070
暂无简介~
格式:doc
大小:17KB
软件:Word
页数:0
分类:
上传时间:2021-11-18
浏览量:2