- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
gdb_first_part.doc
GDB
第一章:一个GDB会话样例
1 一个GDB会话样例
你可以随意用这部手册来了解有关GDB的一切。然而,一些趁手的命令就足以开始使用调试器。这一章介绍了这些命令。
在这个简单的会话里,我们强调用户输入用黑体来显示,这样可以和环境输出明确的区分开来。
GNU m4(通用宏处理器)的以前版本有以下的一个bug:有时候,在我们改变了宏默认的引号字符串的时候,用来在别的宏里捕获
宏定义的命令就失效了。在接下来简短的m4例子里,我们定义了一个展开是“0000”的宏foo;我们接着用m4内建的defn来定义宏bar,bar的
值也是“0000”。然而,在我们用QUOTE来替代开引号字符和用UNQUOTE替代闭引号字符的后,定义一个同义词baz的相同的过程却失败了。
baz:
$ cd gnu/m4
$ ./m4
define(foo,0000)
foo
0000
define(bar,defn(‘foo’))
bar
0000
changequote(QUOTE,UNQUOTE)
define(baz,defn(QUOTEfooUNQUOTE))
baz
Ctrl-d
m4: End of input: 0: fatal error: EOF in string
让我们试着用GDB来看看发生了什么。
$ gdb m4
gdb is free software and you are welcome to distribute copies
of it under certain conditions; type “show copying” to see
the conditions.
There is absolutely no warranty for gdb; type “show warranty”
for details.
gdb 0080307, Copyright 1999 Free Software Foundation, Inc…
(gdb)
GDB只是读入仅够在有需要的时候用来发现哪里能够找到后续内容的数据;这将是GDB的第一个提示很开出现。现在我们
让GDB用一个比通常窄的显示区域,这样可以让本书的例子显示的更好。
(gdb) set width 70
我们需要探查m4内建函数changequote是如何工作的。因为已经看过了源代码,我们知道相关的子函数是m4_changequote,所以我们
用GDB break命令在这个函数上设置一个断点。
(gdb) break m4 changequote
Breakpoint 1 at 0x62f4: file builtin.c, line 879.
用run 命令,m4就在GDB的控制下运行了。只要还没有运行到m4_changequote子函数,程序就如同往常一样运行:
(gdb) run
Starting program: /work/Editorial/gdb/gnu/m4/m4
define(foo,0000)
foo
0000
为了出发断点,我们要调用changequote.GDB挂起m4,显示出在它停止执行处的上下文信息。
changequote(QUOTE,UNQUOTE)
Breakpoint 1, m4_changequote (argc=3, argv=0x33c70)
at builtin.c:879
879 if (bad_argc(TOKEN_DATA_TEXT(argv[0]),argc,1,3))
现在我们可以用命令n接着运行当前函数的下一行指令。
(gdb) n
882 set_quotes((argc = 2) ? TOKEN_DATA_TEXT(argv[1])\
: nil,
set_quotes看上去像有可能失败的子函数。为了进入子函数,我们可以用命令s(step)而不是用next。step进入被调用的
子函数的第一行,所以step进入set_qoutes.
(gdb) s
set_quotes (lq=0x34c78 “QUOTE”, rq=0x34c88 “UNQUOTE”)
at input.c:530
530 if (lquote != def_lquote)
这些输出显示了在m4挂起时的调用函数栈。它显示了栈的概要。我们可以用命令backtrace(也可以用缩写bt)来看当前在哪里:
backtrace命令显示了每一个活动子程序的栈。
gdb) bt
#0 set_quotes (lq=0x34c78 “QUOTE”, rq=0x34c88 “UNQUOTE”)
at input.c:530
#1 0×6344 in m4_changequote (argc=3, argv=0x
您可能关注的文档
最近下载
- 2024-2025年数学选择性必修第一册共线向量与共面向量同步检测 2(带答案).docx VIP
- 数据治理概论课件:数据治理工具.pptx VIP
- 08J907 洁净厂房建筑构造.pdf VIP
- 04G323-2 图集钢筋混凝土吊车梁(工作级别A4、A5).pdf VIP
- 全国优质课一等奖统编版语文八年级上册唐诗五首《野望》《黄鹤楼》《使至塞上》《渡荆门送别》《钱塘湖春行》公开课课件.pptx
- 幼儿高热惊厥的急救处理.pptx VIP
- 惯性器件原理课件.pptx VIP
- 新版建设工程工程量清单计价标准解读.pptx VIP
- 危大工程专项施工方案.doc VIP
- 莫桑比克考察报告.pdf VIP
文档评论(0)