您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 优秀程序员gdb调试手册
GDB调试手册GDB概述GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。一般来说,GDB主要帮忙你完成下面四个方面的功能:1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)3、当程序被停住时,可以检查此时你的程序中所发生的事。4、动态的改变你程序的执行环境。从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。让我们一一看来。--一个调试示例源程序:tst.c1#includestdio.h23intfunc(intn)4{5intsum=0,i;6for(i=0;in;i++)7{8sum+=i;9}10returnsum;11}121314main()15{16inti;17longresult=0;18for(i=1;i=100;i++)19{20result+=i;21}2223printf(result[1-100]=%d\n,result);24printf(result[1-250]=%d\n,func(250));25}编译生成执行文件:(Linux下)hchen/testcc-gtst.c-otst使用GDB调试:hchen/testgdbtst----------启动GDBGNUgdb5.1.1Copyright2002FreeSoftwareFoundation,Inc.GDBisfreesoftware,coveredbytheGNUGeneralPublicLicense,andyouarewelcometochangeitand/ordistributecopiesofitundercertainconditions.Typeshowcopyingtoseetheconditions.ThereisabsolutelynowarrantyforGDB.Typeshowwarrantyfordetails.ThisGDBwasconfiguredasi386-suse-linux(gdb)l--------------------l命令相当于list,从第一行开始例出原码。1#includestdio.h23intfunc(intn)4{5intsum=0,i;6for(i=0;in;i++)7{8sum+=i;9}10returnsum;(gdb)--------------------直接回车表示,重复上一次命令11}121314main()15{16inti;17longresult=0;18for(i=1;i=100;i++)19{20result+=i;(gdb)break16--------------------设置断点,在源程序第16行处。Breakpoint1at0x8048496:filetst.c,line16.(gdb)breakfunc--------------------设置断点,在函数func()入口处。Breakpoint2at0x8048456:filetst.c,line5.(gdb)infobreak--------------------查看断点信息。NumTypeDispEnbAddressWhat1breakpointkeepy0x08048496inmainattst.c:162breakpointkeepy0x08048456infuncattst.c:5(gdb)r---------------------运行程序,run命令简写Startingprogram:/home/hchen/test/tstGDB命令行参数启动GDB:gdbexecutablegdb-eexecutable-ccore-filegdbexecutable-pidprocess-id(使用命令'ps-auxw'可以查看进程的pid)选项含义–help-h列出命令行参数。–exec=file-efile指定可执行文件。–core=core-file-ccore-file指明core文件。–command=file-xfile从指定文件中读取gdb命令。–directory=directory-ddirectory把指定目录加入到源文件搜索路径中。–cd=directory以指定目录作为当前路径来运行gdb。–nx-n不要执行.gdbinit文件中的命令。默认情况下,这个文件中的命令会在所有命令行参数处理完后被执行。–batch在非交互模式下运行gdb。从文件中读取命令,所以需要-x选项。–symbols=file-sfile从指定文件中读取符号表。-write允许对可执行文件和core文件进行写操作。–quiet不要打印介绍和版权信息。-q–tty=device指定device为运行程序的标准输入输出。–pid=process-id-pprocess-id指定要附属的进程ID。GDB命令GDB中使用的命令:命令描述help列出gdb帮助信息。helptopic列出相关话题中的gdb命令。helpcommand列出命令描述信息。apropossearch-word搜索相关的话题。infoargsiargs列出运行程序的命令行参数。infobreakpoints列出断点。infobreak列出断点号。infobreakbreakpoint-number列出指定断点的信息。infowatchpoints列出观察点。inforegisters列出使用的寄存器。infothreads列出当前的线程。infoset列出可以设置的选项。BreakandWatchbreakfuntionbreakline-number在指定的函数,或者行号处设置断点。break+offsetbreak-offset在当前停留的地方前面或后面的几行处设置断点。breakfile:func在指定的file文件中的func处设置断点。breakfile:nth在指定的file文件中的第nth行设置断点。break*address在指定的地址处设置断点。一般在没有源代码时使用。breakline-numberifcondition如果条件满足,在指定位置设置断点。breaklinethreadthread-number在指定的线程中中断。使用infothreads可以显示线程号。tbreak设置临时的断点。中断一次后断点会被删除。watchcondition当条件满足时设置观察点。clear清除函数func处的断点。clearfuncclearnth清除第nth行处的断点。deleted删除所有的断点或观察点。deletebreakpoint-numberdeleterange删除指定的断点,观察点。disablebreakpoint-number-or-rangeenablebreakpoint-number-or-range不删除断点,仅仅把它设置为无效,或有效。例子:显示断点:infobreak设置无效:disable2-9enableoncebreakpoint-number设置指定断点有效,当到达断点时置为无效。enabledelbreakpoint-number设置指定断点有效,当到达断点时删除它。finish继续执行到函数结束。LineExecutionstepsstepnumber-of-steps-to-perform进入下一行代码的执行,会进入函数内部。nextnnextnumber执行下一行代码。但不会进入函数内部。untiluntilline-numberuntilline-numberifcondition继续运行直到到达指定行号,或者函数,地址等。returnreturnexpression弹出选中的栈帧(stackframe)。如果后面指定参数,则返回表达式的值。stepisinextini执行下一条汇编/CPU指令。infosignalsinfohandlehandleSIGNAL-NAMEoption当收到信号时执行下列动作:nostop(不要停止程序),stop(停止程序执行),print(显示信号),noprint(不显示),pass/noignore(允许程序处理信号),nopass/ignore(不让程序接受信号)where显示当前的行号和所处的函数。ProgramStackbacktracebt显示当前堆栈的追踪,当前所在的函数。btinner-function-nesting-depthbt-outer-function-nesting-depthbacktracefull打印所有局部变量的值。framenumberfnumber选择指定的栈帧。upnumberdownnumber向上或向下移动指定个数的栈帧。infoframeaddr描述选中的栈帧。infoargsinfoall-reginfolocalsinfocatch显示选中栈帧的参数,局部变量,异常处理函数。all-reg也会列出浮点寄存器。SourceCodelistllistline-numberlistfunctionlist-liststart#,end#listfilename:function列出相应的源代码。setlistsizecountshowlistsize设置list命令打印源代码时的行数。directorydirectory-namedirdirectory-nameshowdirectories在源代码路径前添加指定的目录。directory当后面没有参数时,清除源代码目录。ExamineVariablesprintvariablepvariablepfile::variablep'file'::variable打印指定变量的值。p*array-var@length打印arrary-var中的前length项。p/xvar以十六进制打印整数变量var。p/dvar把变量var当作有符号整数打印。p/uvar把变量var作为无符号整数打印。p/ovar把变量var作为八进制数打印。p/tvarx/baddressx/b&variable以整数二进制的形式打印var变量的值。p/cvariable当字符打印。p/fvariable以浮点数格式打印变量var。p/avariable打印十六进制形式的地址。x/waddressx/4b&variable打印指定的地址,以四字节一组的方式。callexpression类似于print,但不打印void。disassemaddr对指定地址中的指令进行反汇编。ControllingGDBsetgdb-optionvalue设置GDB的选项。setprintarrayonsetprintarrayoffshowprintarray以可读形式打印数组。默认是off。setprintarray-indexesonsetprintarray-indexesoffshowprintarray-indexes打印数组元素的下标。默认是off。setprintprettyonsetprintprettyoffshowprintpretty格式化打印C结构体的输出。setprintuniononsetprintunionoffshowprintunion打印C中的联合体。默认是on。setprintdemangleonsetprintdemangleoffshowprintdemangle控制C++中名字的打印。默认是on。WorkingF
本文标题:优秀程序员gdb调试手册
链接地址:https://www.777doc.com/doc-2719507 .html