收藏 分享(赏)

GDB手册中文版.doc

上传人:hyngb9260 文档编号:7468948 上传时间:2019-05-19 格式:DOC 页数:47 大小:188.76KB
下载 相关 举报
GDB手册中文版.doc_第1页
第1页 / 共47页
GDB手册中文版.doc_第2页
第2页 / 共47页
GDB手册中文版.doc_第3页
第3页 / 共47页
GDB手册中文版.doc_第4页
第4页 / 共47页
GDB手册中文版.doc_第5页
第5页 / 共47页
点击查看更多>>
资源描述

1、GDB 用户手册目录目录 1摘要 2自由软件 2自由软件急需自由文档 2GDB 的贡献者们 .41一个简单的 GDB 会话 .82征服 GDB 的进与出 .132.1 调用 GDB 132.1.1 选择文件 142.1.2 选择模式 162.1.3 启动期间,GDB 做了什么 192.2 退出 GDB .202.3 Shell 命令 212.4 Loging 输出 .213GDB 命令 223.1 命令语法 223.2 命令完成 233.3 获得帮助 254在 GDB 下运行程序 .294.1 适合调试的编译 .294.2 启动程序 .304.3 程序的参数 .324.4 程序的环境 .324

2、.5 程序的工作目录 .344.6 程序的输入输出 .354.7 调试某个已运行的进程 .364.8 杀掉子进程 .374.9 多线程程序的调试 .374.10 多进程程序的调试 .405.0 停止与继续 42摘要象 GDB 这样的调试程序,目的就是让你可以查看其它程序的内部运行过程,或者是在它崩溃的那一时刻它在做什么。GDB 能做 4 件事(这些还需附加其他的一些事) ,帮助你捕获在场的错误:启动程序,设定任何可以影响它行为的东西。在特定的条件下使程序停止。当程序停止时,分析发生了什么。改变程序里的一些东西,进行一个由于 bug 所导致的结果的矫正性试验,同时继续了解另外一个 bug。可以使

3、用 GDB 调试用 C 和 C+编写的程序,更多信息参见 支持的语言,及 C 与C+。部分支持 Modula-2,Modula-2 的更多信息参见 Modula-2。在调试使用 sets、subranges 、 file variables 或嵌套函数的 Pascal 程序时,目前不能工作。GDB 不支持 entering expressions、printing values 或者类似特性的 Pascal 语法。GDB 可以调试 Fortran 写的程序,尽管那必然会涉及到带有下划线后缀的一些变量。GDB 可以调试 Objective-C 写的程序,既可以使用 Apple/NeXT 运行时库

4、,也可以使用GNU Objective-C 运行时库。自由软件GDB 是自由软件,受 GNU 公共许可证( GPL)保护。GPL 给予了你自由复制或改编程序的许可就是说获得拷贝的人也就获得了自由修改它的权利(这意味着他们必须有权访问源代码) ,而且可以自由的发布更多的拷贝。大部分软件公司所使用的版权限制了你的自由。自由软件基金会利用 GLP 保护了这些自由。基本上来说,公共许可证是一个说明你拥有这些自由的许可证,而且你不能把这些自由从任何人那里占为己有。自由软件急需自由文档当今的自由软件社区所存在的最大缺憾不在于软件而在于没有我们可以随同自由软件包含在一起的好文档。好多我们十分重要的程序没有一

5、同提供自由的参考指南和介绍性文本。对任何一个软件包来说,文档是最基本的部分。当一个重要的自由软件包没有与一个自由手册或指南一同提供时,那就是一个极大的缺憾。如今,我们拥有太多这样的缺憾了!拿 Perl 来说,人们日常所使用的指导手册就不是免费的。为什么会这样呢?因为这些手册的作者们在发表它们的时候伴有很多限制项目不能复制、不能修改、不能得到源文件把它们从自由软件世界中驱逐出去了。这类的事情已经不只发生过一次了,而且今后还会陆续发生。我们经常听到某位热心的 GNU 用户说他正在编写的一个手册,他打算把它捐献给社区,可没想到他签署了出版合同而使这个手册不自由了,所有的期望全都破灭。自由文档,就像自

6、由软件一样,是自由的,不需要付费的东西。非自由手册的问题不在于发行商为印刷拷贝所要承担的费用只要它本身很好就行(自由软件基金会也出售印刷拷贝) ,而在于这个问题会约束手册的利用。自由手册可以以源代码的方式获得,允许复制与修改。非自由手册是不允许这么做的。自由文档自由度的标准,一般来说与自由软件差不多。再发布(包括很多常规的商业再发布)必须被允许,不管是以在线形式还以书面形式,以便手册可以伴随着程序的每一份拷贝。允许有关技术性方面的内容的更正也是至关重要的。当人们更改软件,添加或改变其某些特性时,如果他们负责任的话,也将会修改相应的手册因而,他们能够为修改过的程序提供准确而清晰的文档。某个手册的

7、页数你是无法决定的,但是为某个程序的变更版本写一份全新的手册,对于我们的社区来说,那真是没有必要。在改进过程中所运用的某些限制是合理的。例如,要求保持原作者的版权通告、发布条款、以及作者名单,是没有问题的。在修正版本中包含是他们更正的通告也是没有问题的。只要论述的是非技术性的话题(就像这一章) ,可以接受连续完整的章节不可删除或被更改。能够接受这些限制,是因为它们不会妨碍社区对手册的正常使用。无论如何,必须允许对手册中所有关技术性方面的内容进行修改,然后通过所有正常的通道,利用所有常规的媒质,发布这个结果。否则,这些限制就妨碍了对手册的使用,那么它就是非自由的了,我们就得需要一个新的手册来代替

8、它了。请散布有关这一论点的言辞。我们的社区仍然在遗失好多手册,这些手册都在成为私有出版物。如果我们趁早散布自由软件急需自由参考手册和指南这样的言辞的话,也许下一个投稿人就会意识到,只有少数的手册投稿给了自由软件社区。如果你正在撰写文档,请坚持在 GNU 的自由文档许可证或其他的自由许可证下出版它。别忘了,这个决策是需要争得你的赞同的你不用理会出版社的决策。只要你坚持,某些出版社会使用自由许可证的,但是他们不能奢求有买卖的特权;那需要由你自己来发行,并且坚定地说:这就是你想要的。如果这个出版社拒绝了你的生意,那就再换一家。如果你不能确定某个被提议的许可证是自由的,就写信给 licensinggn

9、u.org。你可以使用购买的方式来鼓励商业出版社出售更多的免费的,非赢利版权的手册与指南,尤其是购买那些来自于出版社的拷贝,付给他们撰写或作重大改进的费用。同时,尽量完全避免购买非自由的文档。在购买之前,先查看一下发布条款,不管谁要做你的生意都必须尊重你的自由。查看书的历史,设法奖励支付了作者们工资的那些出版社。自由软件基金会在 http:/www.fsf.org/doc/other-free-books.html 维护了一个已经由其他一些出版社出版了的文档的列表。GDB 的贡献者们Richard Stallman 是 GDB 的原作者,也是其他好多 GNU 程序的原作者。好多人已经对它的开发

10、作了贡献。谨以此节来表彰那些主要的贡献者们。自由软件的一个优点就是每个人都无偿的为它作贡献。遗憾的是,我们无法逐一向他们表示感谢。在 GDB 的发布中,有一个“ChangeLog”文件,做了极为详尽的说明。2.0 版本以前的大量变化已湮灭在时间的迷雾中。恳请:极力欢迎对本节的补充。如果您或您的朋友(或者是敌人,为了公平) ,不公平地在这个列表中被遗漏了,我们愿意加入您的名字。为了使那些可能被遗忘的人们的工作不至于徒劳无功,在此特别感谢那些带领 GDB走过各个重要发布版的那些人:Andrew Cagney(发布了 6.1, 6.0, 5.3, 5.2, 5.1 和 5.0 版) ;Jim Bla

11、ndy(发布了 4.18 版) ;Jason Molenda(发布了 4.17 版) ;Stan Shebs(发布了 4.14版) ;Fred Fish (发布了 4.16,4.15,4.13,4.12,4.11 ,4.10 和 4.9) ;Stu Grossman 和John Gilmore (发布了 4.8,4.7,4.6,4.5 和 4.4 版);John Gilmore(发布了4.3,4.2,4.1,4.0 和 3.9 版) ;Jim Kingdon(发布了 3.5,3.4 和 3.3 版) ;以及 Randy Smith(发布了 3.2,3.1 和 3.0) 。Richard Sta

12、llman,在 Peter TerMaat、Chris Hanson、和 Richard Mlynarik 的多次协助下,完成到了 2.8 版的发布。Michael Tiemann 是 GDB 中大部分 GNU C+支持的作者,得益于来自 Per Bothner 和Daniel Berlin 的其他的一些重要贡献。James Clark 编写了 GNU C+反签名编码器(demangler) 。早期在 C+方面的工作是由 Peter TerMaat 做的(他也做了大量的到 3.0 发布版的常规更新工作) 。GDB 是使用 BFD 子程序库来分析多种目标文件格式的,BFD 是 David V.

13、Henkel-Wallace、Rich Pixley、Steve Chamberlain 和 John Gilmore 的一个合作项目。David Johnson 编写了最初的 COFF 支持。Pace Willison 做了最初的压缩的 COFF 支持。哈里斯计算机系统(Harris Computer Systems)的 Brent Benson 贡献了 DWARF 2 的支持。Adam de Boor 和 Bradley Davis 贡献了 ISI Optimum V 的支持。 Per Bothner、Noboyuki Hikichi 和 Alessandro Forin 贡献了 MIPS

14、 的支持。Jean-Daniel Fekete 贡献了 Sun 386i 的支持。Chris Hanson 改良了 HP9000 的支持。Noboyuki Hikichi 和 Tomoyuki Hasei 贡献了Sony/News OS 3 的支持。David Johnson 贡献了 Encore Umax 的支持。Jyrki Kuoppala 贡献了 Altos 3068 的支持。Jeff Law 贡献了 HP PA 和 SOM 的支持。Keith Packard 贡献了NS32k 的支持。 Doug Rabson 贡献了 Acorn Risc Machine 的支持。Bob Rusk 贡献

15、了 Harris Nighthawk CX-UX 的支持。 Chris Smith 贡献了 Convex 的支持(还有 Fortran 的调试) 。Jonathan Stone 贡献了 Pyramid 的支持。Michael Tiemann 贡献了 SPARC 的支持。Tim Tucker 贡献了对 Gould NP1 和 Gould Powernode 的支持。 Pace Willison 贡献了 Intel 386 的支持。Jay Vosburgh 贡献了 Symmetry 的支持。Marko Mlinar 贡献了 OpenRISC 1000 的支持。Andreas Schwab 贡献了

16、M68k GNU/Linux 的支持。Rich Schaefer 和 Peter Schauer 为支持 SunOS 的共享库提供了帮助。Jay Fenlason 和 Roland McGrath 保证了 GDB 和 GAS 适用于若干机器指令集。Patrick Duval、Ted Goldstein、Vikram Koka 和 Glenn Engel 帮助开发了远程调试。Intel 公司、风河系统(Wind River Systems) 、AMD 、以及 ARM 分别贡献了i960、VxWorks 、A29K UDI 和 RDI targets 的远程调试模块。Brian Fox,readl

17、ine 库的作者,正在提供命令行编辑与命令历史功能。SUNY Buffalo 的 Andrew Beers 编写了语言切换代码、Modula-2 的支持,并且贡献了此手册的语言一章。Fred Fish 做了支持 Unix System Vr4 的大部分编写工作。他也增强了 command-completion 的支持,使其覆盖到了 C+的过载符号。Hitachi America (现在是 Renesas America), Ltd。负责了对 H8/300、H8/500 和 Super-H处理器的支持。NEC 负责了对 v850、Vr4xxx 和 Vr5xxx 处理器的支持。Mitsubishi

18、(现在是 Renesas)负责了对 D10V、D30V 和 M32R/D 处理器的支持。Toshiba 负责了对 TX39 Mips 处理器的支持。Matsushita 负责了对 MN10200 和 MN10300 处理器的支持。Fujitsu 负责了对 SPARClite 和 FR30 处理器的支持。Kung Hsu、Jeff Law 和 Rick Sladkey 添加了对硬件监视点( hardware watchpoints)的支持。Michael Snyder 添加了对跟踪点(tracepoints)的支持。Stu Grossman 编写了 gdbserver。Jim Kingdon、P

19、eter Schauer、Ian Taylor、及 Stu Grossman,修复了几乎数不清的 bug,并且对整个 GDB 做了清理。惠普公司(Hewlett-Packard Company)的一些人贡献了对 PA-RISC 2.0 体系、HP-UX 10.20、10.30 和 11.0 (窄模式 )、HP 的内核执行线程、HP 的 aC+编译器、以及文本用户界面(旧称终端用户界面)的支持。他们是:Ben Krepp、Richard Title、John Bishop、Susan Macchia、 Kathy Mann、Satish Pai、India Paul、Steve Rehrauer

20、 和 Elena Zannoni。Kim Haase 提供了此手册中的 HP-specific 信息。DJ Delorie 为 DJGPP 项目,把 GDB 移植到了 MS-DOS 上。Robert Hoehne 对 DJGPP的移植作了重大的贡献。Cygnus Solutions 已负责起 GDB 的维护,自 1991 年以来已做了大量的开发工作。Cygnus 为 GDB 做全职工作的工程师有:Mark Alexander、Jim Blandy、 Per Bothner、Kevin Buettner、 Edith Epstein、Chris Faylor、Fred Fish、Martin H

21、unt、Jim Ingham、John Gilmore、Stu Grossman、 Kung Hsu、Jim Kingdon、John Metzler、Fernando Nasser、 Geoffrey Noer、Dawn Perchik、Rich Pixley、Zdenek Radouch、Keith Seitz、Stan Shebs、 David Taylor 和 Elena Zannoni. 另外还有: Dave Brolley、Ian Carmichael、Steve Chamberlain、Nick Clifton、 JT Conklin、Stan Cox、DJ Delorie、Ul

22、rich Drepper、Frank Eigler、 Doug Evans、Sean Fagan、David Henkel-Wallace、Richard Henderson、Jeff Holcomb、Jeff Law、Jim Lemke、Tom Lord、Bob Manson、Michael Meissner、Jason Merrill、 Catherine Moore、Drew Moseley、Ken Raeburn、Gavin Romig-Koch、Rob Savoye、Jamie Smith、Mike Stump、Ian Taylor、Angela Thomas、Michael Tie

23、mann、Tom Tromey、Ron Unrau、Jim Wilson 和 David Zuhn,他们做了大大小小不同的贡献。Andrew Cagney、Fernando Nasser 和 Elena Zannoni,他们在 Cygnus Solutions 工作时,实现了最初 GDB/MI 接口。Jim Blandy 添加了预处理宏的支持,那时他在 Red Hat 工作。Andrew Cagney 设计了 GDB 的结构向量。包括 Andrew Cagney、Stephane Carrez、Randolph Chung、Nick Duffek、Richard Henderson、Mark

24、Kettenis、Grace Sainsbury、Kei Sakamoto、 Yoshinori Sato、Michael Snyder、Andreas Schwab、Jason Thorpe、Corinna Vinschen、 Ulrich Weigand 和 Elena Zannoni 的很多人,为把旧有的体系结构移植到这个新的框架上提供了帮助。请发送 FSF 和 GNU 的疑问和问题到 gnugnu.org。这也有一些 其他的方式 联系 FSF。这些页面是由 GDB 的开发者们 维护的。Copyright Free Software Foundation, Inc., 59 Temple

25、 Place - Suite 330, Boston, MA 02111, USA.。只要保留这些信息,以任何媒质,一字不差地复制与分者这一整份文章是允许的。本文是由 GDB 的管理员于 2005 年 7 月 16 日,使用 text2html 生成的。1一个简单的 GDB 会话你可以在你的业余时间利用本手册了解有关 GDB 的一切。可是,少数几个命令,就足以开始使用调试器了。本章就阐明了那些命令。GNU m4(一个普通的宏处理器)的一个初级版本表现出下列 bug:有些时候,当我们改变它默认的引证串(quote string,译者注:也就是我们常说的引号)时,用于捕获一个在别处定义的宏的命令停

26、止工作。在下列简短的 m4 会话中,我们定一个可扩展为 0000 的宏;然后我们利用 m4 內建的 defx 定义一个相同的东西 bar。可是当我们把左引证串(open quote string,译者注:英文直译为开引证串)改为,右引证串(close quote string)改为时,相同的程序不能定义新的替代名 baz:$cd gnu/m4$./m4define(foo,0000)foo0000define(bar,defn(foo)bar0000changequote(,)define(baz,defn(foo)bazC-dm4: End of input: 0: fatal error:

27、 EOF in string让我们利用 GDB 设法看一下发生了什么事。$gdb m4GDB is free software and you are welcome to distribute copiesof it under certain conditions; type “show copying“ to see the conditions.There is absolutely no warranty for GDB; type “show warranty“for details.GDB 6.3.50.20050716, Copyright 1999 Free Software

28、 Foundation, Inc.(gdb)GDB 仅读取足够查找所需的符号数据,余下的按需读取。结果是,第一提示很快就出现了。我们告诉 GDB 使用一个比平常要窄的显示宽度,以使样例与本手册相适应。(gdb)set width 70我们要看一下 m4 內建的 changequote 是如何工作的。通过查看源代码,我们了解到与其相关的子程序是 m4_changequote,因此我们使用 GDB 的 break 命令在那里设置了一个断点。(gdb)break m4_changequoteBreakpoint 1 at 0x62f4: file builtin.c, line 879.使用 run

29、 命令,在 GDB 的控制下,我们开始了 m4 的运行。只要控制没有到达m4_changequote 子程序,程序就会像平常那样运行。(gdb)runStarting program: /work/Editorial/gdb/gnu/m4/m4define(foo,0000)foo0000为了引发断点,我们调用 changequote。GDB 暂停执行 m4,显示中断处的上下文信息。changequote(,)Breakpoint 1, m4_changequote (argc=3, argv=0x33c70)at builtin.c:879879 if (bad_argc(TOKEN_DAT

30、A_TEXT(argv0),argc,1,3)现在,我们使用命令 n(next)向前执行到当前函数的下一行。(gdb) n882 set_quotes(argc = 2) ? TOKEN_DATA_TEXT(argv1): nil,set_quotes 像是一个有希望的子程序。我们可以使用命令 s(step)代替 next 进入到他的里面。Step 转到任意子程序中要被执行的下一行,因此他进入了 set_quotes。(gdb)sset_quotes (lq=0x34c78 “, rq=0x34c88 “)at input.c:530530 if (lquote != def_lquote)显

31、示器显示了目前 m4 所停在子程序(还有它的参数)的被调堆栈帧的展示。它显示了一个堆栈的摘要信息。我们可以使用 backtrace 命令(也可以被拼写为 bt),查看总体上我们在堆栈上的位置:Backtrace 显示了每一个活动子程序的堆栈帧。(gdb) bt#0 set_quotes (lq=0x34c78 “, rq=0x34c88 “)at input.c:530#1 0x6344 in m4_changequote (argc=3, argv=0x33c70)at builtin.c:882#2 0x8174 in expand_macro (sym=0x33320) at macro

32、.c:242#3 0x7a88 in expand_token (obs=0x0, t=209696, td=0xf7fffa30)at macro.c:71#4 0x79dc in expand_input () at macro.c:40#5 0x2930 in main (argc=0, argv=0xf7fffb20) at m4.c:195我们向前单步调试更多的行,看看都发生了什么。前两次我们使用“s”;后两次为了避免陷入 xstrdup 子程序我们使用“n”。(gdb) s0x3b5c 532 if (rquote != def_rquote)(gdb) s0x3b80 535 l

33、quote = (lq = nil | *lq = 0) ? def_lquote : xstrdup(lq);(gdb) n536 rquote = (rq = nil | *rq = 0) ? def_rquote: xstrdup(rq);(gdb) n538 len_lquote = strlen(rquote);最后以行看起来有点古怪;我们能够检查变量 lquote 和 rquote,看看他们现在是不是我们新指定的左右引号。我们使用命令 p 来查看它们的值。(gdb)p lquote$1 = 0x35d40 “(gdb)p rquote$2 = 0x35d50 “Lquote 和 r

34、quote 的确是新的左右引号。为了能够查看上下文,我们可以使用l(list)命令,围绕着当前行,显示十行源代码。(gdb) l533 xfree(rquote);534535 lquote = (lq = nil | *lq = 0) ? def_lquote: xstrdup (lq);536 rquote = (rq = nil | *rq = 0) ? def_rquote: xstrdup (rq);537538 len_lquote = strlen(rquote);539 len_rquote = strlen(lquote);540 541542 void让我们单步执行,通过设

35、置 len_lquote 和 len_rquote 的那两行,然后查看一下它们的值。(gdb)n539 len_rquote = strlen(lquote);(gdb)n540 (gdb)p len_lquote$3 = 9(gdb) p len_rquote$4 = 7假设 len_lquote 和 len_rquote 分别代表 lquote 和 rquote 的长度的话,那显然就是错的。我们能够利用 p 命令给它们设定更好的值,因为它可以打印任何表达式的值表达式中还可以有子程序调用并赋值。(gdb) p len_lquote=strlen(lquote)$5 = 7(gdb) p le

36、n_rquote=strlen(rquote)$6 = 9那足以修复与 m4 內建的 defn 一同使用新引号的问题吗?我们可以使用c(continue)命令使 m4 继续执行,然后试试刚开始时那个有问题的例子:(gdb) cContinuing.define(baz,defn(foo)baz0000成功了!新的引号已经可以象默认的一样工作了。问题看来就是两个输入错误导致了错误的长度计算造成的。我们输入一个 EOF 让 m4 退出。C-dProgram exited normally.“Program exited normally”是 GDB 发出的。它表明 m4 已经结束执行了。我们可以使

37、用 GDB 的 quit 命令结束我们的 GDB 会话。(gdb) quit2征服 GDB 的进与出本章讨论如何启动 GDB,并且如何离开 GDB。要点为: 输入“gdb”启动 GDB 输入 quit 或 C-d 退出 GDB2.1 调用 GDB 如何启动 GDB2.2 退出 GDB 如何退出 GDB2.3 Shell 命令 如何在 GDB 中使用 Shell 命令2.4 Loging 输出 如果把 GDB 的输出记录成为一个文件2.1 调用 GDB通过运行 gdb 程序来调用 GDB。一旦启动,GDB 就开始从终端读取命令,直到你让它退出为止。你也可以使用多种参数与选项来运行 gdb,在一开

38、始就能更多地为您定义调试环境。对于命令行选项的描述,这里打算覆盖多种情况。在一些环境中,某些选项可能会不起作用。启动 GDB 最常用的方法是使用一个参数,指定一个可执行程序:gdb program也可以指定一个可执行程序和一个 core 文件一起启动 gdb:gdb program core如果你想调试一个运行中的程序,作为代替,你可以指定一个进程 ID 为第二个参数:gdb program 1234将把 GDB 附着到进程 1234(除非你也有一个名叫“1234”的文件;GDB 总是先检查core 文件) 。运动第二个命令行参数需要一个相当完整的操作系统;当我们利用 GDB 作为远程调试器附

39、着到一个裸板上时,那里可能没有任何“进程”的概念,那也就常常无法获得 core dump。如果 GDB 没有能力附着或读取 core dumps 时,它会发出警告。可以使用-args 选项,给 gdb 要调试的程序传递参数。这一选项使 gdb 的选项处理停止。gdb args gcc -O2 -c foo.c这使得 gdb 调试 gcc,并给 gcc 传递命令行参数(见 4.3 程序的参数一节) “-O2 -c foo.c”。可以通过指定-silent 选项,运行 gdb 而不打印前面的资料,这些资料说明 GDB 不作任何担保。gdb silent你可以通过设定命令行选项,更多地控制 GDB

40、的启动。GDB 自身就能够给你各种可用选项的提示。输入gdb help显示所有可用选项,并对它们的用法作了简短的描述(可以简写成 gdb h,作用相同) 。所有的选项和命令行参数按照你所给的顺序进行处理。当使用“-x”选项时,顺序就就比较重要了。2.1.1 选择文件2.1.2 选择模式2.1.3 启动期间,GDB 做了什么2.1.1 选择文件在 GDB 启动时,除了选项之外,它把所有的参数都看作是可执行文件和 core 文件(或者是进程 ID)来读取。就如同这些参数已分别被 “-se”和“-c” (或者是“-p” )选项所修饰过一样。 (GDB 读取的第一个参数,如果没有关联的选项标志,就等同

41、于“-se ”选项后面参数;如果有第二个这样的参数的话,就等同于“-c ”/“-p”选项后的参数)如果第二个参数是以一个 10 进制数开头的话,GDB 首先会尝试把它作为一个进程去附着,如果失败了的话,就尝试着把它作为 core 文件打开。如果有一个文件名以数字开头的 core 文件的话,可用通过附加./前缀来避免 GDB 把它当成 pid,如 ./12345。如果 GDB 已经被配置为不支持 core 文件,比如大部分的嵌入式目标,它将拒绝第二个参数而忽略它。大部分的选项都有长格式和短格式;都被展示在下表中。GDB 也能识别不完整的长格式,只要与给出的各个选项之间没有歧义就行。 (如果你愿意

42、,你可以使用“-”来标记选项参数,而不用“-” ,虽然我们展示的是更常用的约定) 。-symbols file -s file 从文件 file 中读取符号表。-exec file -e file 把文件 file 当作可执行文件来使用,在适当的时候执行,连同 core dump,分析单纯的数据。-se file从文件 file 中读取符号表,并把它当作可执行文件来使用。-core file -c file 把文件 file 当成 core 文件使用,进行分析。-c number -pid number -p number同附着命令一样,连接到一个进程 ID number。 如果没有这个进程,

43、GDB 就尝试着打开一个名为 number 的 core 文件。-command file -x file执行文件 file 中的 GDB 命令。参见命令文件一章-directory directory -d directory添加 directory 到原文件搜索路径。-m -mapped警告:这个选项依赖于操作系统的功能,并不被所有的操作系统所支持。如果你的操作系统可以通过 mmap 系统调用使用内存映射文件(memory-mapped files) ,你就可以利用这个选项,让 GDB 把你程序的符号写到当前目录下的一个可重用文件(reusable file)中。如果你正调试程序是“/tm

44、p/fred” ,那么对应的符号文件就是“/tmp/fred.syms” 。之后的 GDB 调试会话会注意这个文件的存在,并且快速的映射它的符号信息,而不需要从可执行程序的符号表中读取。“.syms”文件特属于 GDB 所运行的主机。它保存着 GDB 内部符号表的精确映像。它不能被多个主机平台交叉共享。-r -readnow立即读取每一个符号文件的整个符号表,不同于默认的根据需要而逐步读取。这使得启动会更慢,但之后的操作会更快。为了创建一个包换完整符号信息的“.syms”文件,典型的做法是-mapped 与-readnow联合使用(参见文件指定命令一章,有关“.syms”文件的资料)。一个简单

45、的创建一个“.symes”文件以便以后使用的 GDB 调用是:gdb -batch -nx -mapped -readnow programname2.1.2 选择模式可以以两种模式中的一种运行 GDB批处理模式或单调模式。-nx-n不执行在任何初始化文件中找到的命令。默认情况下,GDB 会在处理完所有命令选项与参数之后执行这些文件里的命令。参见命令文件一章。-quiet -silent -q “单调”。不打印介绍性信息和版权信息。这些信息在批处理模式下也是不打印的。-batch以批处理模式运行。处理完所有由“-x”所指定的命令文件(如果不使用“-n”来约束,还有所有的初始化文件)后以状态 0

46、 退出。在执行命令文件中的命令过程中,如果发生错误,则以非 0 状态退出。GDB 作为一个过滤器运行时,批处理模式可能会有用,例如,在另外一台计算机上下载并运行一段程序;为了使这个更有用,消息Program exited normally.(只要程序是在 GDB 的控制下运行终止的,一般都会使这个结果 )说明批处理模式下的运行是没有问题。-nowindows -nw“无窗口” 。倘若 GDB 伴随有一个图形用户界面(GUI ) ,这时这个选项就告诉GDB 仅使用命令行界面。如果没有 GUI 可用,这个选项也就没有作用。-windows -w 如果 GDB 含有一个 GUI 的话,那么这个选项就

47、是请求:如果可能的话,就使用它。-cd directory用 directory 代替当前的目录,作为 GDB 的运行工作目录运行。-fullname -f当 GDB 作为 GNU Emacs 的子进程运行时,设置这个选项。他告诉 GDB 以某一标准输出完整的文件名和行号,以便每次都能以大家公认方式显示栈结构(这也包括每次程序停止时)。这个公认的格式为:两个“032”字符后面跟着一个文件名,行号和字符位置以颜色区分,外加一个换行。Emacs-to-GDB 的接口程序利用两个“032”字符作为显示栈结构源代码的信号。-epoch当 GDB 作为 Epoch Emacs-GDB 接口的子进程运行时

48、,设置这个选项。它告诉 GDB修改它的打印程序,以便 Epoch 可以在分割窗口中显示表达式的值。-annotate level这个选项设置 GDB 内部的注释级别。它的作用和使用“set annotate leave”相同(参见 25.GDB 的注释一章) 。注释级别控制着应有多少消息同 GDB 的提示符一起打印,这些信息有:表达式的值、源代码行数以及其他类型的一些输出。级别0 是默认级别,级别 1 用于 GDB 作为 Emacs 的子进程时,级别 3 是最大量的在GDB 控制下的程序的相关信息,级别 2 现在已经不被建议使用了。这个注释机制在很大程度上已被 GDB/MI 所代替(参见 24

49、.GDB/IM 接口一章) 。-args改变对命令行的解释,以使可执行文件的参数可以被作为命令行参数传给它。这个选项阻止选项处理。-baud bps -b bps设置任一用于 GDB 远程调试的串行接口的线速度。-l timeout设置任一用于 GDB 远程调试的通讯的超时值(以秒为单位) 。-tty device -t device把 device 作为程序的标准输入输出运行。-tui启动时激活文本用户界面。文本用户界面在终端上管理几个文本窗口,显示源代码、汇编、寄存器和 GDB 的命令输出(参见 GDB 文本用户界面 一章) 。最为选择,通过调用“gdbtui”程序可以启动文本用户界面。如果你在 Emacs 中运行GDB,不要使用这个选项(参见在 GNU Emacs 下使用 GDB 一章) 。-interpreter interp使用解释器 interp 与控制程序或设备一起作为接口。这个选项是想让与 GDB 通讯的程序作为它的一个后端程序。参见命令解释器一章。“-i

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报