⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gdb调试精粹及使用实例.htm

📁 从IDE转到gdb调试
💻 HTM
📖 第 1 页 / 共 4 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<!-- saved from url=(0035)http://www.freshbug.com/archives/65 -->
<HTML lang=zh-CN xmlns="http://www.w3.org/1999/xhtml"><HEAD 
profile=http://gmpg.org/xfn/11><TITLE>GDB调试精粹及使用实例</TITLE>
<META http-equiv=Content-Type content="text/html; charset=UTF-8">
<META content="  GDB调试精粹及使用实例" name=Description>
<META http-equiv=author content=freshbug><LINK title=RSD 
href="http://www.freshbug.com/xmlrpc.php?rsd" type=application/rsd+xml 
rel=EditURI><LINK href="http://www.freshbug.com/wp-includes/wlwmanifest.xml" 
type=application/wlwmanifest+xml rel=wlwmanifest>
<SCRIPT src="GDB调试精粹及使用实例.files/prototype.js" type=text/javascript></SCRIPT>

<META content="MSHTML 6.00.2900.5512" name=GENERATOR><LINK 
href="GDB调试精粹及使用实例.files/index.css" type=text/css rel=stylesheet>
<SCRIPT src="GDB调试精粹及使用实例.files/index.php" type=text/javascript></SCRIPT>
<!-- Start Of Script Generated By WP-UserOnline 2.20 -->
<SCRIPT src="GDB调试精粹及使用实例.files/tw-sack.js" type=text/javascript></SCRIPT>

<SCRIPT src="" type=text/javascript></SCRIPT>
<!-- End Of Script Generated By WP-UserOnline 2.20 -->
<STYLE type=text/css media=screen>@import url( http://www.freshbug.com/wp-content/themes/fb/style.css );
</STYLE>

<SCRIPT src="GDB调试精粹及使用实例.files/tes.js"></SCRIPT>
<LINK href="http://www.freshbug.com/wp-content/themes/fb/fbimg/favicon.gif" 
type=image/ico rel="shortcut icon"><LINK title="RSS 2.0" 
href="http://www.freshbug.com/feed" type=application/rss+xml rel=alternate><LINK 
title="RSS .92" href="http://www.freshbug.com/feed/rss" type=text/xml 
rel=alternate><LINK title="Atom 0.3" href="http://www.freshbug.com/feed/atom" 
type=application/atom+xml rel=alternate><LINK 
href="http://www.freshbug.com/xmlrpc.php" rel=pingback><LINK title=2008年12月 
href="http://www.freshbug.com/archives/date/2008/12" rel=archives><LINK 
title=2008年11月 href="http://www.freshbug.com/archives/date/2008/11" 
rel=archives><LINK title=2008年10月 
href="http://www.freshbug.com/archives/date/2008/10" rel=archives><LINK 
title=2008年9月 href="http://www.freshbug.com/archives/date/2008/09" 
rel=archives><LINK title=2008年8月 
href="http://www.freshbug.com/archives/date/2008/08" rel=archives><LINK 
title=2008年7月 href="http://www.freshbug.com/archives/date/2008/07" 
rel=archives><LINK title=2008年6月 
href="http://www.freshbug.com/archives/date/2008/06" rel=archives><LINK 
title=2008年5月 href="http://www.freshbug.com/archives/date/2008/05" 
rel=archives><LINK title=2008年4月 
href="http://www.freshbug.com/archives/date/2008/04" rel=archives><LINK 
title=2008年3月 href="http://www.freshbug.com/archives/date/2008/03" 
rel=archives><LINK title=2008年2月 
href="http://www.freshbug.com/archives/date/2008/02" rel=archives><LINK 
title=2008年1月 href="http://www.freshbug.com/archives/date/2008/01" 
rel=archives><LINK title=2007年12月 
href="http://www.freshbug.com/archives/date/2007/12" rel=archives><LINK 
title=2007年11月 href="http://www.freshbug.com/archives/date/2007/11" 
rel=archives></HEAD>
<BODY><!--<div id="freshbugorz">-->
<DIV id=header-freshbug>
<DIV id=headin-freshbug>
<DIV class="freshbugblog freshbug-f"><A title=freshbug.com 
href="http://www.freshbug.com/">freshbug.com</A></DIV>
<DIV class="description freshbug-f"><A title=品味年轻,分享喜悦,记录过程的精彩 
href="http://www.freshbug.com/">品味年轻,分享喜悦,记录过程的精彩</A></DIV>
<DIV id=freshbugtab2><A 
href="http://translate.google.com/translate?hl=en&amp;u=http://www.freshbug.com/archives/65">English</A> 
</DIV></DIV></DIV>
<DIV class=clearfix id=wrapper>
<DIV id=content>
<DIV id=content-freshbug>
<DIV class="nav clearfix">
<DIV class=prev-p>« <A 
href="http://www.freshbug.com/archives/64">Google声称对今日大盘下跌负责</A></DIV>
<DIV class=next-p><A href="http://www.freshbug.com/archives/66">ACE 
5.6在VS2005下的安装步骤</A> »</DIV></DIV>
<DIV id=pagina>
<DIV class="freshbug-tit clearfix">
<DIV class=freshbug-cad>
<DIV class=freshbug-Y>2008-8</DIV>
<DIV class=freshbug-D>13</DIV></DIV>
<DIV class=freshbug-meta>
<DIV>
<H2 class=post-titulo id=post-65><A title="Permalink to GDB调试精粹及使用实例" 
href="http://www.freshbug.com/archives/65" 
rel=bookmark>GDB调试精粹及使用实例</A></H2></DIV>
<DIV>发表于: <A title="查看 口碑效应 的全部文章" 
href="http://www.freshbug.com/archives/category/wordofmouth" 
rel="category tag">口碑效应</A>, <A title="查看 好好活着 的全部文章" 
href="http://www.freshbug.com/archives/category/living" 
rel="category tag">好好活着</A> | 执笔: <A title="作者: freshbug" 
href="http://www.freshbug.com/archives/author/admin/">freshbug</A> </DIV>
<DIV>关键字: <A href="http://www.freshbug.com/archives/tag/gdb-调试-linux" 
rel=tag>gdb 调试 linux</A></DIV></DIV></DIV>
<P>
<DIV class=freshbug-ad-undertitle>
<SCRIPT type=text/javascript><!--				google_ad_client = "pub-3782903016783837";				/* 728x90, 创建于 08-2-21 */				google_ad_slot = "5468837182";				google_ad_width = 728;				google_ad_height = 90;				//-->				</SCRIPT>

<SCRIPT src="GDB调试精粹及使用实例.files/show_ads.js" type=text/javascript>				</SCRIPT>
</DIV>
<DIV class="postentry clearfix">
<P>从IDE转到gdb调试,一开始很不习惯,读了命令列表之后依然会遇到很多在IDE里看来顺理成章的调试方法,命令行下却行不通了,转这个文章来学习。</P>
<P>重要命令:</P>
<P>break file:line-number</P>
<P>break file:function-name</P>
<P>break line-or-function if expr</P>
<P>countinue(从断点继续执行)</P>
<P>delete breakpoint bp-index(断点编号)</P>
<P>disable breakpoint bp-index</P>
<P>enable breakpoint bp-index</P>
<P>clean file-line-number(源文件行号)</P>
<P>finish(运行至当前子函数结束并显示返回值)</P>
<P>一:列文件清单<BR>1. List<BR>(gdb) list line1,line2</P>
<P>二:执行程序<BR>要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(&lt;和&gt;)和外壳通配符(*、?、[、])在内。<BR>如果你使用不带参数的run命令,gdb就再次使用你给予前一条run命令的参数,这是很有用的。<BR>利用set 
args 命令就可以修改发送给程序的参数,而使用show args 命令就可以查看其缺省参数的列表。<BR>(gdb)set args –b 
–x<BR>(gdb) show args<BR>backtrace命令为堆栈提供向后跟踪功能。<BR>Backtrace 
命令产生一张列表,包含着从最近的过程开始的所以有效过程和调用这些过程的参数。</P>
<P>三:显示数据<BR>利用print 命令可以检查各个变量的值。<BR>(gdb) print p (p为变量名)<BR>whatis 
命令可以显示某个变量的类型<BR>(gdb) whatis p<BR>type = int *</P>
<P>print 是gdb的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。表达式除了包含你程序中的变量外,还可以包含以下内容:<BR>l 
对程序中函数的调用<BR>(gdb) print find_entry(1,0)<BR>l 数据结构和其他复杂对象<BR>(gdb) print 
*table_start<BR>$8={e=reference=’\000’,location=0×0,next=0×0}<BR>l 
值的历史成分<BR>(gdb)print $1 ($1为历史记录变量,在以后可以直接引用 $1 的值)<BR>l 
人为数组<BR>人为数组提供了一种去显示存储器块(数组节或动态分配的存储区)内容的方法。早期的调试程序没有很好的方法将任意的指针换成一个数组。就像对待参数一样,让我们查看内存中在变量h后面的10个整数,一个动态数组的语法如下所示:<BR>base@length<BR>因此,要想显示在h后面的10个元素,可以使用h@10:<BR>(gdb)print 
h@10<BR>$13=(-1,345,23,-234,0,0,0,98,345,10)</P>
<P>四:断点(breakpoint)<BR>break命令(可以简写为b)可以用来在调试的程序中设置断点,该命令有如下四种形式:<BR>l break 
line-number 使程序恰好在执行给定行之前停止。<BR>l break function-name 使程序恰好在进入指定的函数之前停止。<BR>l 
break line-or-function if condition 如果condition(条件)是真,程序到达指定行或函数时停止。<BR>l break 
routine-name 在指定例程的入口处设置断点</P>
<P>如果该程序是由很多原文件构成的,你可以在各个原文件中设置断点,而不是在当前的原文件中设置断点,其方法如下:<BR>(gdb) break 
filename:line-number<BR>(gdb) break filename:function-name</P>
<P>要想设置一个条件断点,可以利用break if命令,如下所示:<BR>(gdb) break line-or-function if 
expr<BR>例:<BR>(gdb) break 46 if testsize==100</P>
<P>从断点继续运行:countinue 命令<BR>五.断点的管理</P>
<P>1. 显示当前gdb的断点信息:<BR>(gdb) info break<BR>他会以如下的形式显示所有的断点信息:<BR>Num Type Disp 
Enb Address What<BR>1 breakpoint keep y 0×000028bc in init_random at 
qsort2.c:155<BR>2 breakpoint keep y 0×0000291c in init_organ at 
qsort2.c:168<BR>(gdb)<BR>2.删除指定的某个断点:<BR>(gdb) delete breakpoint 
1<BR>该命令将会删除编号为1的断点,如果不带编号参数,将删除所有的断点<BR>(gdb) delete 
breakpoint<BR>3.禁止使用某个断点<BR>(gdb) disable breakpoint 1<BR>该命令将禁止断点 1,同时断点信息的 
(Enb)域将变为 n<BR>4.允许使用某个断点<BR>(gdb) enable breakpoint 1<BR>该命令将允许断点 1,同时断点信息的 
(Enb)域将变为 y<BR>5.清除原文件中某一代码行上的所有断点<BR>(gdb)clean number<BR>注:number 
为原文件的某个代码行的行号<BR>六.变量的检查和赋值<BR>l whatis:识别数组或变量的类型<BR>l 
ptype:比whatis的功能更强,他可以提供一个结构的定义<BR>l set variable:将值赋予变量<BR>l print 
除了显示一个变量的值外,还可以用来赋值</P>
<P>七.单步执行<BR>l next<BR>不进入的单步执行<BR>l 
step<BR>进入的单步执行<BR>如果已经进入了某函数,而想退出该函数返回到它的调用函数中,可使用命令finish<BR>八.函数的调用<BR>l call 
name 调用和执行一个函数<BR>(gdb) call gen_and_sork( 1234,1,0 )<BR>(gdb) call 
printf(“abcd”)<BR>$1=4<BR>l finish 结束执行当前函数,显示其返回值(如果有的话)</P>
<P>九.机器语言工具<BR>有一组专用的gdb变量可以用来检查和修改计算机的通用寄存器,gdb提供了目前每一台计算机中实际使用的4个寄存器的标准名字:<BR>l 
$pc : 程序计数器<BR>l $fp : 帧指针(当前堆栈帧)<BR>l $sp : 栈指针<BR>l $ps : 处理器状态</P>
<P>十.信号<BR>gdb 
通常可以捕捉到发送给它的大多数信号,通过捕捉信号,它就可决定对于正在运行的进程要做些什么工作。例如,按CTRL-C将中断信号发送给gdb,通常就会终止gdb。但是你或许不想中断gdb,真正的目的是要中断gdb正在运行的程序,因此,gdb要抓住该信号并停止它正在运行的程序,这样就可以执行某些调试操作。</P>
<P>Handle命令可控制信号的处理,他有两个参数,一个是信号名,另一个是接受到信号时该作什么。几种可能的参数是:<BR>l nostop 
接收到信号时,不要将它发送给程序,也不要停止程序。<BR>l stop 
接受到信号时停止程序的执行,从而允许程序调试;显示一条表示已接受到信号的消息(禁止使用消息除外)<BR>l print 接受到信号时显示一条消息<BR>l 
noprint 接受到信号时不要显示消息(而且隐含着不停止程序运行)<BR>l pass 
将信号发送给程序,从而允许你的程序去处理它、停止运行或采取别的动作。<BR>l nopass 
停止程序运行,但不要将信号发送给程序。<BR>例如,假定你截获SIGPIPE信号,以防止正在调试的程序接受到该信号,而且只要该信号一到达,就要求该程序停止,并通知你。要完成这一任务,可利用如下命令:<BR>(gdb) 
handle SIGPIPE stop 
print<BR>请注意,UNIX的信号名总是采用大写字母!你可以用信号编号替代信号名<BR>如果你的程序要执行任何信号处理操作,就需要能够测试其信号处理程序,为此,就需要一种能将信号发送给程序的简便方法,这就是signal命令的任务。该命令的参数是一个数字或者一个名字,如SIGINT。假定你的程序已将一个专用的SIGINT(键盘输入,或CTRL-C;信号2)信号处理程序设置成采取某个清理动作,要想测试该信号处理程序,你可以设置一个断点并使用如下命令:<BR>(gdb) 
signal 2<BR>continuing with signal 
SIGINT(2)<BR>该程序继续执行,但是立即传输该信号,而且处理程序开始运行.</P>
<P>十一. 原文件的搜索<BR>search text:该命令可显示在当前文件中包含text串的下一行。<BR>Reverse-search 
text:该命令可以显示包含text 的前一行。</P>
<P>十二.UNIX接口<BR>shell 命令可启动UNIX外壳,CTRL-D退出外壳,返回到 gdb.</P>
<P>十三.命令的历史<BR>为了允许使用历史命令,可使用 set history expansion on 命令<BR>(gdb) set history 
expansion on</P>
<P>小结:常用的gdb命令<BR>backtrace 显示程序中的当前位置和表示如何到达当前位置的栈跟踪(同义词:where)<BR>breakpoint 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -