📄 使用 gdb 调试 linux 软件.htm
字号:
<BR>#0 0x80483ea in wib (no1=8, no2=8) at eg1.c:7
<BR>#1 0x8048435 in main (argc=1, argv=0xbffff9c4)
at eg1.c:21 <BR>此结果显示了在 main() 的第 21 行中调用了函数
wib()(只要使用 list 21 就能证实 <BR>这一点),而且 wib() 在 0
号帧中,main() 在 1 号帧中。由于 wib() 在 0 号帧中
<BR>,那么它就是执行程序时发生算术错误的函数。 <BR>实际上,发出 info locals
命令时,gdb 会打印出当前帧中的局部变量,缺省情况下, <BR>这个帧中的函数就是被中断的函数(0
号帧)。可以使用命令 frame 打印当前帧。要查 <BR>看 main 函数(在 1
号帧中)中的变量,可以发出 frame 1 切换到 1 号帧,然后发出 <BR>info
locals 命令: <BR>(gdb) frame 1 <BR>#1 0x8048435 in
main (argc=1, argv=0xbffff9c4) at eg1.c:21 <BR>21
result = wib(value, div); <BR>(gdb) info locals
<BR>value = 8 <BR>div = 8 <BR>result = 4 <BR>i = 2
<BR>total = 6 <BR>此信息显示了在第三次执行 "for" 循环时(i 等于
2)发生了错误,此时 "value" 等 <BR>于 "div"。 <BR>可以通过如上所示在
frame 命令中明确指定号码,或者使用 up 命令在堆栈中上移以及 <BR>down
命令在堆栈中下移来切换帧。要获取有关帧的进一步信息,如它的地址和程序语 <BR>言,可以使用命令
info frame。 <BR>gdb 堆栈命令可以在程序执行期间使用,也可以在 core
文件中使用,因此对于复杂的 <BR>程序,可以在程序运行时跟踪它是如何转到函数的。
<BR>连接到其它进程 <BR>除了调试 core 文件或程序之外,gdb
还可以连接到已经运行的进程(它的程序已经过
<BR>编译,并加入了调试信息),并中断该进程。只需用希望 gdb 连接的进程标识替换 co
<BR>re 文件名就可以执行此操作。以下是一个执行循环并睡眠的示例程序: <BR>eg2 示例代码
<BR>#include <BR>int main(int argc, char *argv[])
<BR>{ <BR>int i; <BR>for(i = 0; i < 60; i++)
<BR>{ <BR>sleep(1); <BR>} <BR>return 0; <BR>}
<BR>使用 gcc -g eg2.c -o eg2 编译该程序并使用 ./eg2 &
运行该程序。请留意在启动该 <BR>程序时在背景上打印的进程标识,在本例中是 1283:
<BR>./eg2 & <BR>[3] 1283 <BR>启动 gdb
并指定进程标识,在我举的这个例子中是 gdb eg2 1283。gdb 会查找一个叫 <BR>作
"1283" 的 core 文件。如果没有找到,那么只要进程 1283 正在运行(在本例中可
<BR>能在 sleep() 中),gdb 就会连接并中断该进程: <BR>...
<BR>/home/seager/gdb/1283: No such file or
directory. <BR>Attaching to program:
/home/seager/gdb/eg2, Pid 1283 <BR>...
<BR>0x400a87f1 in __libc_nanosleep () from
/lib/libc.so.6 <BR>(gdb) <BR>此时,可以发出所有常用 gdb
命令。可以使用acktrace 来查看当前位置与 main() <BR>的相对关系,以及
mian() 的帧号是什么,然后切换到 main() 所在的帧,查看已经在 <BR>"for"
循环中运行了多少次: <BR>(gdb) backtrace <BR>#0 0x400a87f1
in __libc_nanosleep () from /lib/libc.so.6 <BR>#1
0x400a877d in __sleep (seconds=1) at
../sysdeps/unix/sysv/linux/sleep.c:7 <BR>8 <BR>#2
0x80483ef in main (argc=1, argv=0xbffff9c4) at
eg2.c:7 <BR>(gdb) frame 2 <BR>#2 0x80483ef in main
(argc=1, argv=0xbffff9c4) at eg2.c:7 <BR>7
sleep(1); <BR>(gdb) print i <BR>$1 = 50
<BR>如果已经完成了对程序的修改,可以 detach 命令继续执行程序,或者 kill 命令杀死
<BR>进程。还可以首先使用 file eg2 装入文件,然后发出 attach 1283
命令连接到进程标 <BR>识 1283 下的 eg2。 <BR>其它小技巧 <BR>gdb
可以让您通过使用 shell 命令在不退出调试环境的情况下运行 shell 命令,调用
<BR>形式是 shell [commandline],这有助于在调试时更改源代码。
<BR>最后,在程序运行时,可以使用 set 命令修改变量的值。在 gdb 下再次运行 eg1,使
<BR>用命令reak 7 if diff==0 在第 7
行(将在此处计算结果)设置条件断点,然后运行 <BR>程序。当 gdb 中断执行时,可以将
"diff" 设置成非零值,使程序继续运行直至结束: <BR><BR>Breakpoint 1,
wib (no1=8, no2=8) at eg1.c:7 <BR>7 result = no1 /
diff; <BR>(gdb) print diff <BR>$1 = 0 <BR>(gdb)
set diff=1 <BR>(gdb) continue <BR>Continuing.
<BR>0 wibed by 16 equals 10 <BR><BR>Program exited
normally. <BR>结束语 <BR>GNU
调试器是所有程序员工具库中的一个功能非常强大的工具。在本文中,我只介绍了 <BR>gdb
的一小部分功能。要了解更多知识,建议您阅读 GNU 调试器手册。 <BR>参考资料 <BR>GNU
调试器手册 <BR>调试会话示例的源代码。 <BR>连接示例的源代码。 <BR>关于作者
<BR>David Seager 是 IBM 的软件开发人员,他从事 Linux 和基于 Web
的应用工作已有两 <BR>年时间了。 </DIV></TD></TR>
<TR>
<TD vAlign=top align=right><SPAN
class=normalfont><B>责任编辑:</B> otto</SPAN></TD></TR>
<TR>
<FORM name=""
action=http://www.linuxeden.com/doc/modify.php?action=modprofile
method=post>
<TD vAlign=top borderColor=#c0c0c0 align=left
width=71 bgColor=#eeeeee>
<DIV class=edit_article><INPUT type=hidden
value=19619 name=articleid> <INPUT type=hidden
name=articletitle> <INPUT type=hidden value=otto
name=articleauthor> <INPUT type=hidden
value=modprofile name=action> <INPUT class=button
type=image height=19 width=68
src="使用 GDB 调试 Linux 软件.files/edit.gif" border=0>
</DIV></TD></FORM></TR></TBODY></TABLE></TD></TR>
<TR>
<TD vAlign=top colSpan=2>
<TABLE cellSpacing=0 cellPadding=0 width="100%"
bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD>
<TABLE cellSpacing=1 cellPadding=4 width="100%"
border=0>
<TBODY>
<TR align=middle bgColor=#eeeeee>
<TD noWrap width="20%"><SPAN
class=normalfont><B><A
href="http://www.linuxeden.com/doc/comment.php/19619?action=add">发表评论</A></B></SPAN></TD>
<TD noWrap width="20%"><SPAN
class=normalfont><B><A
href="http://www.linuxeden.com/doc/comment.php/19619?action=view">查看评论</A></B></SPAN></TD>
<TD noWrap width="20%"><SPAN
class=normalfont><B><A
href="http://www.linuxeden.com/doc/favorite.php/19619/1?action=add">加入收藏</A></B></SPAN></TD>
<TD noWrap width="20%"><SPAN
class=normalfont><B><A
href="http://www.linuxeden.com/doc/recommend.php/19619/1">Email给朋友</A></B></SPAN></TD>
<TD noWrap width="20%"><SPAN
class=normalfont><B><A
href="http://www.linuxeden.com/doc/print.php/19619">打印本文</A></B></SPAN></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR>
<TR align=middle>
<TD width="60%"><SPAN class=normalfont><B>如果你想对该文章评分,
请先<A
href="http://www.linuxeden.com/doc/member.php?action=login">登陆</A>,
如果你仍未注册,请点击<A
href="http://www.linuxeden.com/doc/register.php">注册链接</A>注册成为本站会员.</B></SPAN>
</TD>
<TD>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD><SPAN class=normalfont><B>平均得分 0, 共 0
人评分</B></SPAN></TD></TR>
<TR>
<TD>
<TABLE cellSpacing=1 cellPadding=2 border=0>
<TBODY>
<TR>
<TD vAlign=bottom width=10 height=20><IMG
height=1 src="使用 GDB 调试 Linux 软件.files/bar.gif"
width=10 border=0></TD>
<TD vAlign=bottom width=10 height=20><IMG
height=1 src="使用 GDB 调试 Linux 软件.files/bar.gif"
width=10 border=0></TD>
<TD vAlign=bottom width=10 height=20><IMG
height=1 src="使用 GDB 调试 Linux 软件.files/bar.gif"
width=10 border=0></TD>
<TD vAlign=bottom width=10 height=20><IMG
height=1 src="使用 GDB 调试 Linux 软件.files/bar.gif"
width=10 border=0></TD>
<TD vAlign=bottom width=10 height=20><IMG
height=1 src="使用 GDB 调试 Linux 软件.files/bar.gif"
width=10 border=0></TD>
<TD vAlign=bottom width=10 height=20><IMG
height=1 src="使用 GDB 调试 Linux 软件.files/bar.gif"
width=10 border=0></TD>
<TD vAlign=bottom width=10 height=20><IMG
height=1 src="使用 GDB 调试 Linux 软件.files/bar.gif"
width=10 border=0></TD>
<TD vAlign=bottom width=10 height=20><IMG
height=1 src="使用 GDB 调试 Linux 软件.files/bar.gif"
width=10 border=0></TD>
<TD vAlign=bottom width=10 height=20><IMG
height=1 src="使用 GDB 调试 Linux 软件.files/bar.gif"
width=10 border=0></TD>
<TD vAlign=bottom width=10 height=20><IMG
height=1 src="使用 GDB 调试 Linux 软件.files/bar.gif"
width=10 border=0></TD></TR>
<TR>
<TD noWrap align=middle><SPAN
class=smallfont>1</SPAN></TD>
<TD noWrap align=middle><SPAN
class=smallfont>2</SPAN></TD>
<TD noWrap align=middle><SPAN
class=smallfont>3</SPAN></TD>
<TD noWrap align=middle><SPAN
class=smallfont>4</SPAN></TD>
<TD noWrap align=middle><SPAN
class=smallfont>5</SPAN></TD>
<TD noWrap align=middle><SPAN
class=smallfont>6</SPAN></TD>
<TD noWrap align=middle><SPAN
class=smallfont>7</SPAN></TD>
<TD noWrap align=middle><SPAN
class=smallfont>8</SPAN></TD>
<TD noWrap align=middle><SPAN
class=smallfont>9</SPAN></TD>
<TD noWrap align=middle><SPAN
class=smallfont>10</SPAN>
</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR>
<TR align=middle>
<TD
colSpan=2></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR>
<TR bgColor=#bcbcbc>
<TD colSpan=2 height=1></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=4 width=830 bgColor=#eeeeee border=0>
<TBODY>
<TR>
<TD width="50%"><SPAN class=middlefont>Copyright © 2002 -2003 <A
href="http://www.linuxeden.com/doc">Linuxeden.com---自由文档</A><BR>All rights
reserved. </SPAN></TD><!-- <td width="50%" align="right">
<span class="middlefont">Powered by: <a href="http://www.21ds.net">phpArticle</a>
Version 2.0 </span>
</td> --></TR></TBODY></TABLE></CENTER><NOSCRIPT>
<DIV align=center><FONT size=1><A href="http://www.ace5.com/">dvd
copy</A> <A href="http://www.directvdeals.us/">direct tv</A><A
href="http://www.alltheshareware.com/">dvd copy</A><A
href="http://www.hzyg.com.cn/">多串口卡,串口服务器,终端服务器,KVM切换器</A> <A
href="http://www.allthesatellitetv.com/">dish network</A> <A
href="http://www.allthesatellitetv.com/">dish network</A><A
href="http://www.alltheshareware.com/DVDCloner-Software-56039.html">DVD
Cloner</A> <A
href="http://www.alltheshareware.com/Clone-DVD-Software-56038.html">Clone
DVD</A> <A
href="http://www.alltheshareware.com/EditPad-Pro-Software-71754.html">EditPad
Pro</A> <A
href="http://www.alltheshareware.com/WinBackup-Software-54792.html">WinBackup</A>
<A href="http://www.alltheshareware.com/PDF-to-Word-Software-66153.html">PDF to
WORD</A> <A
href="http://www.alltheshareware.com/MagicTweak-Software-69222.html">Windows
Tweak</A> <A
href="http://www.alltheshareware.com/Smart-Protector-Internet-Tracks-Eraser-Software-45166.html">Internet
Tracks Eraser </A><A
href="http://www.alltheshareware.com/TrueType-Barcode-Font-Pack-Software-62377.html">TrueType
Barcode Font</A> <A
href="http://www.alltheshareware.com/POSTNET-Barcode-Fonts-Software-54288.html">POSTNET
Barcode Font</A> <A
href="http://www.alltheshareware.com/Code-39-Barcode-Font-Pack-Software-40844.html">Code
39 Font</A> <A href="http://www.supercounters.com/">free web hit
counter</A></FONT> </DIV></NOSCRIPT></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -