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

📄 gdb-5-modules.php.html

📁 使用gdb调试linux下程序的详细说明
💻 HTML
📖 第 1 页 / 共 2 页
字号:
</form><img src="GDB-5-modules.php_files/icon_dot_002.gif">&nbsp;<a href="http://www.linuxts.com/modules.php?name=Your_Account&amp;op=new_user">注册</a><br><img src="GDB-5-modules.php_files/icon_dot_002.gif">&nbsp;<a href="http://www.linuxts.com/modules.php?name=Your_Account&amp;op=pass_lost">忘记密码</a><br></font></td></tr></tbody></table></td></tr></tbody></table><br><table bgcolor="#000000" width="150" cellpadding="0" cellspacing="0" border="0"><tbody><tr><td><table cellpadding="3" cellspacing="1" border="0" width="100%"><tbody><tr><td bgcolor="#ffffff"><font class="content">即时信息</font></td></tr><tr><td bgcolor="#ffffff"><font class="content"><img width="17" height="14" src="GDB-5-modules.php_files/group-3.gif"> <b><u>人在线:</u></b><br><img width="17" height="14" src="GDB-5-modules.php_files/ur-anony.gif"> 游客: <b>5</b><br><img width="17" height="14" src="GDB-5-modules.php_files/ur-member.gif"> 会员: <b>0</b><br><img width="17" height="14" src="GDB-5-modules.php_files/ur-registered.gif"> 总计: <b>5</b><br></font></td></tr></tbody></table></td></tr></tbody></table><br><table bgcolor="#000000" width="150" cellpadding="0" cellspacing="0" border="0"><tbody><tr><td><table cellpadding="3" cellspacing="1" border="0" width="100%"><tbody><tr><td bgcolor="#ffffff"><font class="content">合作伙伴</font></td></tr><tr><td bgcolor="#ffffff"><font class="content">网站:<br><a target="_blank" href="http://www.linuxaid.com.cn/">LinuxAID技术支持中心</a><br><a target="_blank" href="http://www.opendesktop.net/">OpenDesktop社区</a><br>平媒:<br><a target="_blank" href="http://linux.ccidnet.com/">《开放系统世界》</a><br></font></td></tr></tbody></table></td></tr></tbody></table><br><table bgcolor="#000000" width="150" cellpadding="0" cellspacing="0" border="0"><tbody><tr><td><table cellpadding="3" cellspacing="1" border="0" width="100%"><tbody><tr><td bgcolor="#ffffff"><font class="content">RedHat官方指南</font></td></tr><tr><td bgcolor="#ffffff"><font class="content"><a target="_blank" href="http://www.linuxts.com/doc/rhl-ig-x86-zh_CN-9/index.html">RedHat 9.0安装指南</a><br><a target="_blank" href="http://www.linuxts.com/doc/rhl-gsg-zh_CN-9/index.html">RedHat 9.0入门指南</a><br><a target="_blank" href="http://www.linuxts.com/doc/rhl-cg-zh_CN-9/index.html">RedHat 9.0定制指南</a></font></td></tr></tbody></table></td></tr></tbody></table><br><table bgcolor="#000000" width="150" cellpadding="0" cellspacing="0" border="0"><tbody><tr><td><table cellpadding="3" cellspacing="1" border="0" width="100%"><tbody><tr><td bgcolor="#ffffff"><font class="content">调查</font></td></tr><tr><td bgcolor="#ffffff"><font class="content"></font><form method="post" action="modules.php?name=Surveys"><font class="content"><input value="3" name="pollID" type="hidden"><input value="modules.php?name=Surveys&amp;op=results&amp;pollID=3" name="forwarder" type="hidden"><font class="content"><b>开发tsmail的插件,你最关心?</b></font><br><br><table width="100%" border="0"><tbody><tr><td valign="top"><input value="1" name="voteID" type="radio"></td><td width="100%"><font class="content">其他的webmail。</font></td></tr><tr><td valign="top"><input value="2" name="voteID" type="radio"></td><td width="100%"><font class="content">更好的管理端。</font></td></tr><tr><td valign="top"><input value="3" name="voteID" type="radio"></td><td width="100%"><font class="content">从其他qmail系统上转换的程序。</font></td></tr><tr><td valign="top"><input value="4" name="voteID" type="radio"></td><td width="100%"><font class="content">更好看的模板。</font></td></tr><tr><td valign="top"><input value="5" name="voteID" type="radio"></td><td width="100%"><font class="content">其他。</font></td></tr></tbody></table><br></font><center><font class="content"><font class="content"><input value="投票" type="submit"></font><br><br><font class="content"><a href="http://www.linuxts.com/modules.php?name=Surveys&amp;op=results&amp;pollID=3&amp;mode=&amp;order=&amp;thold="><b>结果</b></a><br><a href="http://www.linuxts.com/modules.php?name=Surveys"><b>投票一览</b></a><br><br>投票: <b>143</b> <br> 评论: <b>0</b></font></font></center></form></td></tr></tbody></table></td></tr></tbody></table><br><table bgcolor="#000000" width="150" cellpadding="0" cellspacing="0" border="0"><tbody><tr><td><table cellpadding="3" cellspacing="1" border="0" width="100%"><tbody><tr><td bgcolor="#ffffff"><font class="content">最新下载</font></td></tr><tr><td bgcolor="#ffffff"><font class="content"><strong><big>·</big></strong>&nbsp;1: <a href="http://www.linuxts.com/modules.php?name=Downloads&amp;d_op=viewdownloaddetails&amp;lid=82&amp;title=fedora1_cd3">fedora1 cd3</a><br><strong><big>·</big></strong>&nbsp;2: <a href="http://www.linuxts.com/modules.php?name=Downloads&amp;d_op=viewdownloaddetails&amp;lid=81&amp;title=fedora1_cd2">fedora1 cd2</a><br><strong><big>·</big></strong>&nbsp;3: <a href="http://www.linuxts.com/modules.php?name=Downloads&amp;d_op=viewdownloaddetails&amp;lid=80&amp;title=fedora1_cd1">fedora1 cd1</a><br><strong><big>·</big></strong>&nbsp;4: <a href="http://www.linuxts.com/modules.php?name=Downloads&amp;d_op=viewdownloaddetails&amp;lid=79&amp;title=AntiVir%20for%20Linux%20Server">AntiVir for Linux Server</a><br><strong><big>·</big></strong>&nbsp;5: <a href="http://www.linuxts.com/modules.php?name=Downloads&amp;d_op=viewdownloaddetails&amp;lid=76&amp;title=tsmail-qmail-2.0-rh8">tsmail-qmail-2.0-rh8</a><br></font></td></tr></tbody></table></td></tr></tbody></table><br></td><td><img alt="" border="0" height="1" width="15" src="GDB-5-modules.php_files/pixel.gif"></td><td width="100%"><table bgcolor="#cccccc" cellpadding="0" cellspacing="1" border="0" width="100%"><tbody><tr><td><table bgcolor="#ffffff" cellpadding="8" cellspacing="1" border="0" width="100%"><tbody><tr><td><font class="option"><b>用GDB调试程序(5)</b></font><br><br><font class="content">(72 阅读) &nbsp;&nbsp;<a href="http://www.linuxts.com/modules.php?name=Sections&amp;op=printpage&amp;artid=225"><img height="11" width="15" alt="以易于打印的格式显示" border="0" src="GDB-5-modules.php_files/print.gif"></a></font><br><br><br><br><p><font face="Courier New"><strong>查看运行时数据<br>———————</strong><br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 在你调试程序时,当程序被停住时,你可以使用print命令(简写命令为p),或是同义命令inspect来查看当前程序的运行数据。print命令的格式是:<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; print &lt;expr&gt;<br>&nbsp;&nbsp;&nbsp; print /&lt;f&gt; &lt;expr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;expr&gt;是表达式,是你所调试的程序的语言的表达式(GDB可以调试多种编程语言),&lt;f&gt;是输出的格式,比如,如果要把表达式按16进制的格式输出,那么就是/x。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br><strong>一、表达式</strong></font></p><p><font face="Courier New">&nbsp;&nbsp;&nbsp;print和许多GDB的命令一样,可以接受一个表达式,GDB会根据当前的程序运行的数据来计算这个表达式,既然是表达式,那么就可以是当前程序运行中的const常量、变量、函数等内容。可惜的是GDB不能使用你在程序中所定义的宏。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 表达式的语法应该是当前所调试的语言的语法,由于C/C++是一种大众型的语言,所以,本文中的例子都是关于C/C++的。(而关于用GDB调试其它语言的章节,我将在后面介绍)<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 在表达式中,有几种GDB所支持的操作符,它们可以用在任何一种语言中。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; @<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是一个和数组有关的操作符,在后面会有更详细的说明。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; ::<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定一个在文件或是一个函数中的变量。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; {&lt;type&gt;} &lt;addr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表示一个指向内存地址&lt;addr&gt;的类型为type的一个对象。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br><strong>二、程序变量</strong></font></p><p><font face="Courier New">&nbsp;&nbsp;&nbsp; 在GDB中,你可以随时查看以下三种变量的值:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、全局变量(所有文件可见的)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、静态全局变量(当前文件可见的)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、局部变量(当前Scope可见的)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;如果你的局部变量和全局变量发生冲突(也就是重名),一般情况下是局部变量会隐藏全局变量,也就是说,如果一个全局变量和一个函数中的局部变量同名时,如果当前停止点在函数中,用print显示出的变量的值会是函数中的局部变量的值。如果此时你想查看全局变量的值时,你可以使用“::”操作符:<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file::variable<br>&nbsp;&nbsp;&nbsp; function::variable<br>&nbsp;&nbsp;&nbsp; 可以通过这种形式指定你所想查看的变量,是哪个文件中的或是哪个函数中的。例如,查看文件f2.c中的全局变量x的值:<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; gdb) p 'f2.c'::x<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 当然,“::”操作符会和C++中的发生冲突,GDB能自动识别“::” 是否C++的操作符,所以你不必担心在调试C++程序时会出现异常。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;另外,需要注意的是,如果你的程序编译时开启了优化选项,那么在用GDB调试被优化过的程序时,可能会发生某些变量不能访问,或是取值错误码的情况。这个是很正常的,因为优化程序会删改你的程序,整理你程序的语句顺序,剔除一些无意义的变量等,所以在GDB调试这种程序时,运行时的指令和你所编写指令就有不一样,也就会出现你所想象不到的结果。对付这种情况时,需要在编译程序时关闭编译优化。一般来说,几乎所有的编译器都支持编译优化的开关,例如,GNU的C/C++编译器GCC,你可以使用“-gstabs”选项来解决这个问题。关于编译器的参数,还请查看编译器的使用说明文档。<br>&nbsp;&nbsp;&nbsp; </font></p><p><font face="Courier New"><strong>三、数组</strong></font></p><p><font face="Courier New">&nbsp;&nbsp;&nbsp; 有时候,你需要查看一段连续的内存空间的值。比如数组的一段,或是动态分配的数据的大小。你可以使用GDB的“@”操作符,“@”的左边是第一个内存的地址的值,“@”的右边则你你想查看内存的长度。例如,你的程序中有这样的语句:<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int *array = (int *) malloc (len * sizeof (int));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 于是,在GDB调试过程中,你可以以如下命令显示出这个动态数组的取值:</font></p><p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p </font><font face="Courier New">*array@len</font></p><p><font face="Courier New">&nbsp;&nbsp;&nbsp; @的左边是数组的首地址的值,也就是变量array所指向的内容,右边则是数据的长度,其保存在变量len中,其输出结果,大约是下面这个样子的:<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (gdb) p </font><font face="Courier New">*array@len</font><br><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $1 = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40}</font></p><p><font face="Courier New">&nbsp;&nbsp;&nbsp; 如果是静态数组的话,可以直接用print数组名,就可以显示数组中所有数据的内容了。</font></p><p><font face="Courier New">&nbsp;&nbsp;&nbsp; <br><strong>四、输出格式</strong></font></p><p><font face="Courier New">&nbsp;&nbsp;&nbsp; 一般来说,GDB会根据变量的类型输出变量的值。但你也可以自定义GDB的输出的格式。例如,你想输出一个整数的十六进制,或是二进制来查看这个整型变量的中的位的情况。要做到这样,你可以使用GDB的数据显示格式:<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; x&nbsp; 按十六进制格式显示变量。<br>&nbsp;&nbsp;&nbsp; d&nbsp; 按十进制格式显示变量。<br>&nbsp;&nbsp;&nbsp; u&nbsp; 按十六进制格式显示无符号整型。<br>&nbsp;&nbsp;&nbsp; o&nbsp; 按八进制格式显示变量。<br>&nbsp;&nbsp;&nbsp; t&nbsp; 按二进制格式显示变量。 <br>&nbsp;&nbsp;&nbsp; a&nbsp; 按十六进制格式显示变量。<br>&nbsp;&nbsp;&nbsp; c&nbsp; 按字符格式显示变量。<br>&nbsp;&nbsp;&nbsp; f&nbsp; 按浮点数格式显示变量。</font></p><p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (gdb) p i<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $21 = 101&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (gdb) p/a i<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $22 = 0x65<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (gdb) p/c i<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $23 = 101 'e'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (gdb) p/f i<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $24 = 1.41531145e-43<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (gdb) p/x i<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $25 = 0x65<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (gdb) p/t i<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $26 = 1100101</font></p><p><br><font face="Courier New"><strong>五、查看内存</strong></font></p><p><font face="Courier New">&nbsp;&nbsp;&nbsp; 你可以使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下所示:<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; x/&lt;n/f/u&gt; &lt;addr&gt; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; n、f、u是可选的参数。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。<br>&nbsp;&nbsp;&nbsp; f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。<br>&nbsp;&nbsp;&nbsp;u表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &lt;addr&gt;表示一个内存地址。</font></p><p><font face="Courier New">&nbsp;&nbsp;&nbsp; n/f/u三个参数可以一起使用。例如:<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br><strong>六、自动显示</strong></font></p><p><font face="Courier New">&nbsp;&nbsp;&nbsp; 你可以设置一些自动显示的变量,当程序停住时,或是在你单步跟踪时,这些变量会自动显示。相关的GDB命令是display。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; display &lt;expr&gt; <br>&nbsp;&nbsp;&nbsp; display/&lt;fmt&gt; &lt;expr&gt; <br>&nbsp;&nbsp;&nbsp; display/&lt;fmt&gt; &lt;addr&gt;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; expr是一个表达式,fmt表示显示的格式,addr表示内存地址,当你用display设定好了一个或多个表达式后,只要你的程序被停下来,GDB会自动显示你所设置的这些表达式的值。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 格式i和s同样被display支持,一个非常有用的命令是:<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; display/i $pc<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; $pc是GDB的环境变量,表示着指令的地址,/i则表示输出格式为机器指令码,也就是汇编。于是当程序停下后,就会出现源代码和机器指令码相对应的情形,这是一个很有意思的功能。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 下面是一些和display相关的GDB命令:<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; undisplay &lt;dnums...&gt;<br>&nbsp;&nbsp;&nbsp; delete display &lt;dnums...&gt;<br>&nbsp;&nbsp;&nbsp; 删除自动显示,dnums意为所设置好了的自动显式的编号。如果要同时删除几个,编号可以用空格分隔,如果要删除一个范围内的编号,可以用减号表示(如:2-5)<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; disable display &lt;dnums...&gt;<br>&nbsp;&nbsp;&nbsp; enable display &lt;dnums...&gt;<br>&nbsp;&nbsp;&nbsp; disable和enalbe不删除自动显示的设置,而只是让其失效和恢复。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; info display<br>&nbsp;&nbsp;&nbsp; 查看display设置的自动显示的信息。GDB会打出一张表格,向你报告当然调试中设置了多少个自动显示设置,其中包括,设置的编号,表达式,是否enable。</font></p></td></tr><tr><td align="center"> &nbsp;&nbsp; <br><br>[ <a href="http://www.linuxts.com/modules.php?name=Sections&amp;op=listarticles&amp;secid=2">返回到本类 </a> | <a href="http://www.linuxts.com/modules.php?name=Sections">知识中心目录</a> ]</td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table><table align="center" width="100%"><tbody><tr align="center"><td colspan="3" width="100%"><font class="footmsg">Copyright &#169; 2002-2003 by <a href="http://www.linuxts.com/"><font class="footmsg_l">linuxts技术研究站点</font></a>. All Rights Reserved. <a href="mailto:linuxts@linuxaid.com.cn">如有意见请与站长联系</a><br>Page Generation: 0.985 秒<br></font> </td></tr></tbody></table></body></html>

⌨️ 快捷键说明

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