《GDB单步调试》word版.doc_第1页
《GDB单步调试》word版.doc_第2页
《GDB单步调试》word版.doc_第3页
《GDB单步调试》word版.doc_第4页
《GDB单步调试》word版.doc_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

GDB 单步调试1、首先需要用gcc(g+)对源文件进行编译生成可执行文件,并且在编译时加上选项-g,把调试信息加到目标文件中。2、假设生成的可执行文件为test,那么gdb test可以用gdb打开test文件,然后通过break linenum设置断点。可以输入list查看源文件和行号,方便设置断点。断点设置好后就可以run命令运行到断点处了。下面是转载一、初始化输入gdb进入gdb调试环境。或者直接输入gdb+progfile来加载文件。注意该文件是使用gcc(或g+)编译得到的。为了使gdb正常工作,必须使你的程序在编译时包含调试信息,编译时必须使用-g参数来。或者进入gdb环境后,通过命令file+progfile来加载需要调试的可执行文件文件。查看源代码:list函数名行数设置程序运行参数:set args二、暂停程序gdb可以使用几种方式来暂停程序:断点,观察点,捕捉点,信号,线程停止。当程序被暂停后,可以使用continue、next、step来继续执行程序。continue执行到下一暂停点或程序结束。next执行一行源代码但不进入函数内部。step执行一行源代码而且进入函数内部。1、设置断点:a、break+源代码行号源代码函数名内存地址b、break.if condition.可以是上述任一参数,condition条件。例如在循环体中可以设置break.if i=100来设置循环次数。2、设置观察点:a、watch+变量表达式当变量或表达式值改变时即停住程序。b、rwatch+变量表达式当变量或表达式被读时,停住程序。c、awatch+变量表达式当变量或表达式被读或被写时,停住程序。3、设置捕捉点:catch+event当event发生时,停住程序。event可以是下面的内容:1)、throw一个C+抛出的异常。(throw为关键字)2)、catch一个C+捕捉到的异常。(catch为关键字)3)、exec调用系统调用exec时。(exec为关键字,目前此功能只在HP-UX下有用)4)、fork调用系统调用fork时。(fork为关键字,目前此功能只在HP-UX下有用)5)、vfork调用系统调用vfork时。(vfork为关键字,目前此功能只在HP-UX下有用)6)、load或load载入共享库(动态链接库)时。(load为关键字,目前此功能只在HP-UX下有用)7)、unload或unload卸载共享库(动态链接库)时。(unload为关键字,目前此功能只在HP-UX下有用)4、捕捉信号:handle+argu+signals signals:是Linux/Unix定义的信号,SIGINT表示中断字符信号,也就是Ctrl+C的信号,SIGBUS表示硬件故障的信号;SIGCHLD表示子进程状态改变信号;SIGKILL表示终止程序运行的信号,等等。argu:nostop当被调试的程序收到信号时,GDB不会停住程序的运行,但会打出消息告诉你收到这种信号。stop当被调试的程序收到信号时,GDB会停住你的程序。print当被调试的程序收到信号时,GDB会显示出一条信息。noprint当被调试的程序收到信号时,GDB不会告诉你收到信号的信息。pass or noignore当被调试的程序收到信号时,GDB不处理信号。这表示,GDB会把这个信号交给被调试程序会处理。nopass or ignore当被调试的程序收到信号时,GDB不会让被调试程序来处理这个信号。5、线程中断:breaklinespecthreadthreadnoif.linespec断点设置所在的源代码的行号。如:test.c:12表示文件为test.c中的第12行设置一个断点。threadno线程的ID。是GDB分配的,通过输入info threads来查看正在运行中程序的线程信息。if.设置中断条件。三、查看信息1、查看数据print variable查看变量print*arraylen查看数组(array是数组指针,len是需要数据长度)可以通过添加参数来设置输出格式:/x按十六进制格式显示变量。/d按十进制格式显示变量。/u按十六进制格式显示无符号整型。/o按八进制格式显示变量。/t按二进制格式显示变量。/a按十六进制格式显示变量。/c按字符格式显示变量。/f按浮点数格式显示变量。2、查看内存examine/n fu+内存地址(指针变量)n表示显示内存长度f表示输出格式(见上)u表示字节数制定(b单字节;h双字节;w四字节;g八字节;默认为四字节)如:x/10cw pFilePath(pFilePath为一个字符串指针,指针占4字节)x为examine命令的简写。3、查看栈信息backtrace-nnn表示只打印栈顶上n层的栈信息。-n表示只打印栈底上n层的栈信息。不加参数,表示打印所有栈信息。4、info info address-Describe where symbol SYM is stored info all-registers-List of all registers and their contents info args-Argument variables of current stack frame info auxv-Display the inferiors auxiliary vector info breakpoints-Status of user-settable breakpoints info catch-Exceptions that can be caught in the current stack frame info checkpoints-IDs of currently known forks/checkpoints info classes-All Objective-C classes info common-Print out the values contained in aFortran COMMON block info copying-Conditions for redistributing copies of GDB info dcache-Print information on the dcache performance info display-Expressions to display when program stops info extensions-All filename extensions associated with asource language info files-Names of targets and files being debugged info float-Print the status of the floating point unit info forks-IDs of currently known forks/checkpoints info frame-All about selected stack frame info functions-All fu nction names info handle-What debugger does when program gets various signals info line-Core addresses of the code for asource line info linkmap-Display the inferiors linkmap info locals-Local variables of current stack frame info macro-Show the definition of MACRO info mem-Memory region attributes info proc-Show/proc process information about any running process info program-Execution status of the program info registers-List of integer registers and their contents info scope-List the variables local to ascope info selectors-All Objective-C selectors info set-Show all GDB settings info sharedlibrary-Status of loaded shared object libraries info signals-What debugger does when program gets various signals info source-Information about the current source file info sources-Source files in the program info stack-Backtrace of the stack info symbol-Describe what symbol is at location ADDR info target-Names of targets and files being debugged info termina l-Print inferiors saved terminal status info threads-IDs of currently known threads info tracepoints-Status of tracepoints info types-All type names info variables-All global and static variable names info vector-Print the status of the vector unit info warranty-Various kinds of warranty you do not have info watchpoints-Synonym forinfo breakpointsinfo win-List of all displayed windows附注:基本gdb命令:-命令简写功能-file装入想要调试的可执行文件.kill k终止正在调试的程序.list l列出产生执行文件的源代码的一部分.next n执行一行源代码但不进入函数内部.step s执行一行源代码而且进入函数内部.continue c继续执行程序,直至下一中断或者程序结束。run r执行当前被调试的程序.quit q终止gdb.watch使你能监视一个变量的值而不管它何时被改变.catch设置捕捉点.thread t查看当前运行程序的线程信息.break b在代码里设置断点,这将使程序执行到这里时被挂起.make使你能不退出gdb就可以重新产生可执行文件.shell使你能不离开gdb就执行UNIX shell命令.print p打印数据内容。examine x打印内存内容。backtrace bt查看函数调用栈的所有信息。简述一列文件清单二:执行程序三:显示数据四:断点(breakpoint)五.断点的管理六.变量的检查和赋值七.单步执行八.函数的调用九.机器语言工具十.信号GDB的使用方法简述一列文件清单List(gdb)list line1,line2二:执行程序要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(和)和外壳通配符(*、?、)在内。如果你使用不带参数的run命令,gdb就再次使用你给予前一条run命令的参数,这是很有用的。利用set args命令就可以修改发送给程序的参数,而使用show args命令就可以查看其缺省参数的列表。(gdb)set args-b-x(gdb)show argsbacktrace命令为堆栈提供向后跟踪功能。Backtrace命令产生一张列表,包含着从最近的过程开始的所以有效过程和调用这些过程的参数。三:显示数据利用print命令可以检查各个变量的值。(gdb)print p(p为变量名)print是gdb的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。表达式除了包含你程序中的变量外,还可以包含以下内容:对程序中函数的调用(gdb)print find_entry(1,0)数据结构和其他复杂对象(gdb)print*table_start=e=reference=message0,location=0x0,next=0x0值的历史成分(gdb)print(为历史记录变量,在以后可以直接引用的值)人为数组人为数组提供了一种去显示存储器块(数组节或动态分配的存储区)内容的方法。早期的调试程序没有很好的方法将任意的指针换成一个数组。就像对待参数一样,让我们查看内存中在变量h后面的10个整数,一个动态数组的语法如下所示:baselength因此,要想显示在h后面的10个元素,可以使用h10:(gdb)print h10=(-1,345,23,-234,0,0,0,98,345,10)whatis命令可以显示某个变量的类型(gdb)whatis ptype=int*四:断点(breakpoint)break命令(可以简写为b)可以用来在调试的程序中设置断点,该命令有如下四种形式:break line-number使程序恰好在执行给定行之前停止。break function-name使程序恰好在进入指定的函数之前停止。break line-or-function if condition如果condition(条件)是真,程序到达指定行或函数时停止。break routine-name在指定例程的入口处设置断点如果该程序是由很多原文件构成的,你可以在各个原文件中设置断点,而不是在当前的原文件中设置断点,其方法如下:(gdb)break filename:line-number(gdb)break filename:function-name要想设置一个条件断点,可以利用break if命令,如下所示:(gdb)break line-or-function if expr例:(gdb)break 46 if testsize=100从断点继续运行:countinue命令五.断点的管理1.显示当前gdb的断点信息:(gdb)info break他会以如下的形式显示所有的断点信息:Num Type Disp Enb Address What1 breakpoint keep y0x 000028bc in init_random at qsort2.c:1552 breakpoint keep y0x 0000291c in init_organ at qsort2.c:168删除指定的某个断点:(gdb)delete breakpoint 1该命令将会删除编号为1的断点,如果不带编号参数,将删除所有的断点(gdb)delete breakpoint禁止使用某个断点(gdb)disable breakpoint 1该命令将禁止断点1,同时断点信息的(Enb)域将变为n允许使用某个断点(gdb)enable breakpoint 1该命令将允许断点1,同时断点信息的(Enb)域将变为y清除原文件中某一代码行上的所有断点(gdb)clean number注:number为原文件的某个代码行的行号六.变量的检查和赋值whatis:识别数组或变量的类型ptype:比whatis的功能更强,他可以提供一个结构的定义set variable:将值赋予变量print除了显示一个变量的值外,还可以用来赋值七.单步执行next不进入的单步执行step进入的单步执行如果已经进入了某函数,而想退出该函数返回到它的调用函数中,可使用命令finish八.函数的调用call name调用和执行一个函数(gdb)call gen_and_sork(1234,1,0)(gdb)call pr intf(abcd)=4 finish结束执行当前函数,显示其返回值(如果有的话)九.机器语言工具有一组专用的gdb变量可以用来检查和修改计算机的通用寄存器,gdb提供了目前每一台计算机中实际使用的4个寄存器的标准名字:$pc:程序计数器$fp:帧指针(当前堆栈帧)$sp:栈指针$ps:处理器状态十.信号gdb通常可以捕捉到发送给它的大多数信号,通过捕捉信号,它就可决定对于正在运行的进程要做些什么工作。例如,按CTRL-C将中断信号发送给gdb,通常就会终止gdb。但是你或许不想中断gdb,真正的目的是要中断gdb正在运行的程序,因此,gdb要抓住该信号并停止它正在运行的程序,这样就可以执行某些调试操作。Handle命令可控制信号的处理,他有两个参数,一个是信号名,另一个是接受到信号时该作什么。几种可能的参数是:nostop接收到信号时,不要将它发送给程序,也不要停止程序。stop接受到信号时停止程序的执行,从而允许程序调试;显示一条表示已接受到信号的消息(禁止使用消息除外)print接受到信号时显示一条消息noprint接受到信号时不要显示消息(而且隐含着不停止程序运行)pass将信号发送给程序,从而允许你的程序去处理它、停止运行或采取别的动作。nopass停止程序运行,但不要将信号发送给程序。例如,假定你截获SIGPIPE信号,以防止正在调试的程序接受到该信号,而且只要该信号一到达,就要求该程序停止,并通知你。要完成这一任务,可利用如下命令:(gdb)handle SIGPIPE stop print请注意,UNIX的信号名总是采用大写字母!你可以用信号编号替代信号名如果你的程序要执行任何信号处理操作,就需要能够测试其信号处理程序,为此,就需要一种能将信号发送给程序的简便方法,这就是signal命令的任务。该命令的参数是一个数字或者一个名字,如SIGINT。假定你的程序已将一个专用的SIGINT(键盘输入,或CTRL-C;信号2)信号处理程序设置成采取某个清理动作,要想测试该信号处理程序,你可以设置一个断点并使用如下命令:(gdb)signal 2continuing with signal SIGINT(2)该程序继续执行,但是立即传输该信号,而且处理程序开始运行.GDB的使用方法GDB是一个强大的命令行调试工具。大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本。UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能。于是UNIX下的软件比Windows下的软件更能有机地结合,各自发挥各自的长处,组合成更为强劲的功能。而Windows下的图形软件基本上是各自为营,互相不能调用,很不利于各种软件的相互集成。在这里并不是要和Windows做个什么比较,所谓寸有所长,尺有所短,图形化工具还是有不如命令行的地方。用GDB调试程序GDB概述GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓寸有所长,尺有所短就是这个道理。一般来说,GDB主要帮忙你完成下面四个方面的功能:1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)3、当程序被停住时,可以检查此时你的程序中所发生的事。4、动态的改变你程序的执行环境。从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。让我们一一看来。一个调试示例-源程序:tst.c 1#include 3int func(int n)45 int sum=0,i;6 for(i=0;i 78 sum+=i;910 return sum;1112 13 14 main()1516 int i;17 long result=0;18 for(i=1;i=100;i+)1920 result+=i;2122 23 printf(result1-100=%dn,result);24 printf(result1-250=%dn,func(250);25编译生成执行文件:(Linux下)hchen/test cc-g tst.c-o tst使用GDB调试hchen/test gdb tst-启动GDBGNU gdb 5.1.1Copyright 2002 Free Software Foundation,Inc.GDB is free software,covered by the GNU General Public License,and you are welcome to change it and/or distribute copies of it under certain conditions.Typeshow copyingto see the conditions.There is absolutely no warranty for GDB.Typeshow warrantyfor details.This GDB was configured asi386-suse-linux.(gdb)l-l命令相当于list,从第一行开始例出原码。1#include 3int func(int n)45 int sum=0,i;6 for(i=0;i 78 sum+=i;910 return sum;(gdb)-直接回车表示,重复上一次命令1112 13 14 main()1516 int i;17 long result=0;18 for(i=1;i=100;i+)1920 result+=i;(gdb)break 16-设置断点,在源程序第16行处。Breakpoint 1at 0x 8048496:file tst.c,line 16.(gdb)break func-设置断点,在函数func()入口处。Breakpoint 2at 0x 8048456:file tst.c,line 5.(gdb)info break-查看断点信息。Num Type Disp Enb Address What 1breakpoint keep y0x 08048496 in main at tst.c:16 2breakpoint keep y0x 08048456 in func at tst.c:5(gdb)r-运行程序,run命令简写Starting program:/home/hchen/test/tst Breakpoint 1,main()at tst.c:17-在断点处停住。17 long result=0;(gdb)n-单条语句执行,next命令简写。18 for(i=1;i=100;i+)(gdb)n 20 result+=i;(gdb)n 18 for(i=1;i=100;i+)(gdb)n 20 result+=i;(gdb)c-继续运行程序,continue命令简写。Continuing.result1-100=5050-程序输出。Breakpoint 2,func(n=250)at tst.c:5 5int sum=0,i;(gdb)n 6for(i=1;i=n;i+)(gdb)p i-打印变量i的值,print命令简写。=134513808(gdb)n 8sum+=i;(gdb)n 6for(i=1;i=n;i+)(gdb)p sum=1(gdb)n 8sum+=i;(gdb)p i=2(gdb)n 6for(i=1;i=n;i+)(gdb)p sum=3(gdb)bt-查看函数堆栈。#0 func(n=250)at tst.c:5#1 0x 080484e4 in main()at tst.c:24#2 0x 400409ed in _libc_start_main()from/lib/libc.so.6(gdb)finish-退出函数。Run till exit from#0 func(n=250)at tst.c:5 0x 080484e4 in main()at tst.c:24 24 printf(result1-250=%dn,func(250);Value returned is=31375(gdb)c-继续运行。Continuing.result1-250=31375-程序输出Program exited with code 027.-程序退出,调试结束(gdb)q-退出gdb。hchen/test好了,有了以上的感性认识,还是让我们来系统地认识一下gdb吧。使用GDB-一般来说GDB主要调试的是C/C+的程序。要调试C/C+的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g+)的-g参数可以做到这一点。如:cc-g hello.c-o hello g+-g hello.cpp-o hello如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他。启动GDB的方法有以下几种:1、gdb program也就是你的执行文件,一般在当然目录下。2、gdb core用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。3、gdb如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb-help查看。我在下面只例举一些比较常用的参数:-symbols-s从指定文件中读取符号表。-se file从指定文件中读取符号表信息,并把他用在可执行文件中。-core-c调试时core dump的core文件。-directory-d加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径。GDB的命令概貌-启动gdb后,就你被带入gdb的调试环境中,就可以使用gdb的命令开始调试程序了,gdb的命令可以使用help命令来查看,如下所示:/home/hchen gdb GNU gdb 5.1.1 Copyright 2002 Free Software Foundation,Inc.GDB is free software,covered by the GNU General Public License,and you are welcome to change it and/or distribute copies of it under certain conditions.Typeshow copyingto see the conditions.There is absolutely no warranty for GDB.Typeshow warrantyfor details.This GDB was configured asi386-suse-linux.(gdb)help List of classes of commands:aliases-Aliases of other commands breakpoints-Making program stop at certain points data-Examining data files-Specifying and examining files internals-Maintenance commands obscure-Obscure features running-Running the program stack-Examining the stack status-Status inquiries support-Support facilities tracepoints-Tracing of program execution without stopping the program user-defined-User-defined commands Typehelpfollowed by aclass name for alist of commands in that class.Typehelpfollowed by command name for full documentation.Command name abbreviations are allowed if unambiguous.(gdb)gdb的命令很多,gdb把之分成许多个种类。help命令只是例出gdb的命令种类,如果要看种类中的命令,可以使用help命令,如:help breakpoints,查看设置断点的所有命令。也可以直接help来查看命令的帮助。gdb中,输入命令时,可以不用打全命令,只用打命令的前几个字符就可以了,当然,命令的前几个字符应该要标志着一个唯一的命令,在Linux下,你可以敲击两次TAB键来补齐命令的全称,如果有重复的,那么gdb会把其例出来。示例一:在进入函数func时,设置一个断点。可以敲入break func,或是直接就是b func(gdb)b func Breakpoint 1at 0x 8048458:file hello.c,line 10.示例二:敲入b按两次TAB键,你会看到所有b打头的命令:(gdb)b backtrace break bt(gdb)示例三:只记得函数的前缀,可以这样:(gdb)b make_按TAB键(再按下一次TAB键,你会看到:)make_a_section_from_file make_environ make_abs_section make_function_type make_blockvector make_pointer_type make_cleanup make_reference_type make_command make_symbol_completion_list(gdb)b make_ GDB把所有make开头的函数全部例出来给你查看。示例四:调试C+的程序时,有可以函数名一样。如:(gdb)bbubble(M-?bubble(double,double)bubble(int,int)(gdb)bbubble(你可以查看到C+中的所有的重载函数及参数。(注:M-?和按两次TAB键是一个意思)要退出gdb时,只用发quit或命令简称q就行了。GDB中运行UNIX的shell程序-在gdb环境中,你可以执行UNIX的shell的命令,使用gdb的shell命令来完成:shell调用UNIX的shell来执行,环境变量SHELL中定义的UNIX的shell将会被用来执行,如果SHELL没有定义,那就使用UNIX的标准shell:/bin/sh。(在Windows中使用C或cmd.exe)还有一个gdb命令是make:make可以在gdb中执行make命令来重新build自己的程序。这个命令等价于shell make。在GDB中运行程序-当以gdb方式启动gdb后,gdb会在PATH路径和当前目录中搜索的源文件。如要确认gdb是否读到源文件,可使用l或list命令,看看gdb是否能列出源代码。在gdb中,运行程序使用r或是run命令。程序的运行,你有可能需要设置下面四方面的事。1、程序运行参数。set args可指定运行时参数。(如:set args 10 20 30 40 50)show args命令可以查看设置好的运行参数。2、运行环境。path可设定程序的运行路径。show paths查看程序的运行路径。set environment varname=value设置环境变量。如:set env USER=hchen show environmentvarname查看环境变量。3、工作目录。cd相当于shell的cd命令。pwd显示当前的所在目录。4、程序的输入输出。info terminal显示你程序用到的终端的模式。使用重定向控制程序输出。如:run outfile tty命令可以指写输入输出的终端设备。如:tty/dev/ttyb调试已运行的程序-两种方法:1、在UNIX下用ps查看正在运行的程序的PID(进程ID),然后用gdb PID格式挂接正在运行的程序。2、先用gdb关联上源代码,并进行gdb,在gdb中用attach命令来挂接进程的PID。并用detach来取消挂接的进程。暂停/恢复程序运行-调试程序中,暂停程序运行是必须的,GDB可以方便地暂停程序的运行。你可以设置程序的在哪行停住,在什么条件下停住,在收到什么信号时停往等等。以便于你查看运行时的变量,以及运行时的流程。当进程被gdb停住时,你可以使用info program来查看程序的是否在运行,进程号,被暂停的原因。在gdb中,我们可以有以下几种暂停方式:断点(BreakPoint)、观察点(WatchPoint)、捕捉点(CatchPoint)、信号(Signals)、线程停止(Thread Stops)。如果要恢复程序运行,可以使用c或是continue命令。一、设置断点(BreakPoint)我们用break命令来设置断点。正面有几点设置断点的方法:break在进入指定函数时停住。C+中可以使用class:function或function(type,type)格式来指定函数名。break在指定行号停住。break+offset break-offset在当前行号的前面或后面的offset行停住。offiset为自然数。break filename:linenum在源文件filename的linenum行处停住。break filename:function在源文件filename的function函数的入口处停住。break*address在程序运行的内存地址处停住。break break命令没有参数时,表示在下一条指令处停住。break.if.可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环境体中,可以设置break if i=100,表示当i为100时停住程序。查看断点时,可使用info命令,如下所示:(注:n表示断点号)info breakpointsninfo breakn二、设置观察点(WatchPoint)观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序。我们有下面的几种方法来设置观察点:watch为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。rwatch当表达式(变量)expr被读时,停住程序。awatch当表达式(变量)的值被读或被写时,停住程序。info watchpoints列出当前所设置了的所有观察点。三、设置捕捉点(CatchPoint)你可设置捕捉点来补捉程序运行时的一些事件。如:载入共享库(动态链接库)或是C+的异常。设置捕捉点的格式为:catch当event发生时,停住程序。event可以是下面的内容:1、throw一个C+抛出的异常。(throw为关键字)2、catch一个C+捕捉到的异常。(catch为关键字)3、exec调用系统调用exec时。(exec为关键字,目前此功能只在HP-UX下有用)4、fork调用系统调用fork时。(fork为关键字,目前此功能只在HP-UX下有用)5、vfork调用系统调用vfork时。(vfork为关键字,目前此功能只在HP-UX下有用)6、load或load载入共享库(动态链接库)时。(load为关键字,目前此功能只在HP-UX下有用)7、unload或unload卸载共享库(动态链接库)时。(unload为关键字,目前此功能只在HP-UX下有用)tcatch只设置一次捕捉点,当程序停住以后,应点被自动删除。四、维护停止点上面说了如何设置程序的停止点,GDB中的停止点也就是上述的三类。在GDB中,如果你觉得已定义好的停止点没有用了,你可以使用delete、clear、disable、enable这几个命令来进行维护。clear清除所有的已定义的停止点。clear clear清除所有设置在函数上的停止点。clear clear清除所有设置在指定行上的停止点。deletebreakpointsrange.删除指定的断点,breakpoints为断点号。如果不指定断点号,则表示删除所有的断点。range表示断点号的范围(如:3-7)。其简写命令为d。比删除更好的一种方法是disable停止点,disable了的停止点,GDB不会删除,当你还需要时,enable即可,就好像回收站一样。disablebreakpointsrange.disable所指定的停止点,breakpoints为停止点号。如果什么都不指定,表示disable所有的停止点。简写命令是dis.enablebreakpointsrange.enable所指定的停止点,breakpoints为停止点号。enablebreakpointsonce range.enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动disable。enablebreakpointsdelete range.enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动删除。五、停止条件维护前面在说到设置断点时,我们提到过可以设置一个条件,当条件成立时,程序自动停止,这是一个非常强大的功能,这里,我想专门说说这个条件的相关维护命令。一般来说,为断点设置一个条件,我们使用if关键词,后面跟其断点条件。并且,条件设置好后,我们可以用condition命令来修改断点的条件。(只有break和watch命令支持if,catch目前暂不支持if)condition修改断点号为bnum的停止条件为expression。condition清除断点号为bnum的停止条件。还有一个比较特殊的维护命令ignore,你可以指定程序运行时,忽略停止条件几次。ignore表示忽略断点号为bnum的停止条件count次。六、为停止点设定运行命令我们可以使用GDB提供的command命令来设置停止点的运行命令。也就是说,当运行的程序在被停止住时,我们可以让其自动运行一些别的命令,这很有利行自动化调试。对基于GDB的自动化调试是一个强大的支持。mand-list.end为断点号bnum指写一个命令列表。当程序被该断点停住时,gdb会依次运行命令列表中的命令。例如:break foo if x0 commands printfx is%dn,x continue end断点设置在函数foo中,断点条件是x 0,如果程序被断住后,也就是,一旦x的值在foo函数中大于0,GDB会自动打印出x的值,并继续运行程序。如果你要清除断点上的命令序列,那么只要简单的执行一下commands命令,并直接在打个end就行了。七、断点菜单在C+中,可能会重复出现同一个名字的函数若干次(函数重载),在这种情况下,break不能告诉GDB要停在哪个函数的入口。当然,你可以使用break也就是把函数的参数类型告诉GDB,以指定一个函数。否则的话,GDB会给你列出一个断点菜单供你选择你所需要的断点。你只要输入你菜单列表中的编号就可以了。如:(gdb)b String:after0cancel1a

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论