gdb手册

GDB用户手册

目录

目录 (1)

摘要 (2)

自由软件 (2)

自由软件急需自由文档 (2)

GDB的贡献者们 (4)

1.一个简单的GDB会话 (8)

2.征服GDB的进与出 (13)

2.1调用GDB (13)

2.1.1 选择文件 (14)

2.1.2 选择模式 (16)

2.1.3 启动期间,GDB做了什么 (19)

2.2 退出GDB (20)

2.3 Shell命令 (21)

2.4 Loging输出 (21)

3.GDB命令 (22)

3.1命令语法 (22)

3.2命令完成 (23)

3.3获得帮助 (25)

4.在GDB下运行程序 (29)

4.1 适合调试的编译 (29)

4.2 启动程序 (30)

4.3 程序的参数 (32)

4.4 程序的环境 (32)

4.5 程序的工作目录 (34)

4.6 程序的输入输出 (35)

4.7 调试某个已运行的进程 (36)

4.8 杀掉子进程 (37)

4.9 多线程程序的调试 (37)

4.10 多进程程序的调试 (40)

5.0停止与继续 (42)

摘要

象GDB这样的调试程序,目的就是让你可以查看其它程序的内部运行过程,或者是在它崩溃的那一时刻它在做什么。

GDB能做4件事(这些还需附加其他的一些事),帮助你捕获在场的错误:

·启动程序,设定任何可以影响它行为的东西。

·在特定的条件下使程序停止。

·当程序停止时,分析发生了什么。

·改变程序里的一些东西,进行一个由于bug所导致的结果的矫正性试验,同时继续了解另外一个bug。

可以使用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运行时库,也可以使用GNU Objective-C运行时库。

自由软件

GDB是自由软件,受GNU公共许可证(GPL)保护。GPL给予了你自由复制或改编程序的许可——就是说获得拷贝的人也就获得了自由修改它的权利(这意味着他们必须有权访问源代码),而且可以自由的发布更多的拷贝。大部分软件公司所使用的版权限制了你的自由。自由软件基金会利用GLP保护了这些自由。

基本上来说,公共许可证是一个说明你拥有这些自由的许可证,而且你不能把这些自由从任何人那里占为己有。

自由软件急需自由文档

当今的自由软件社区所存在的最大缺憾不在于软件——而在于没有我们可以随同自由

软件包含在一起的好文档。好多我们十分重要的程序没有一同提供自由的参考指南和介绍性文本。对任何一个软件包来说,文档是最基本的部分。当一个重要的自由软件包没有与一个自由手册或指南一同提供时,那就是一个极大的缺憾。如今,我们拥有太多这样的缺憾了!

拿Perl来说,人们日常所使用的指导手册就不是免费的。为什么会这样呢?因为这些手册的作者们在发表它们的时候伴有很多限制项目——不能复制、不能修改、不能得到源文件——把它们从自由软件世界中驱逐出去了。

这类的事情已经不只发生过一次了,而且今后还会陆续发生。我们经常听到某位热心的GNU用户说他正在编写的一个手册,他打算把它捐献给社区,可没想到他签署了出版合同而使这个手册不自由了,所有的期望全都破灭。

自由文档,就像自由软件一样,是自由的,不需要付费的东西。非自由手册的问题不在于发行商为印刷拷贝所要承担的费用——只要它本身很好就行(自由软件基金会也出售印刷拷贝),而在于这个问题会约束手册的利用。自由手册可以以源代码的方式获得,允许复制与修改。非自由手册是不允许这么做的。

自由文档自由度的标准,一般来说与自由软件差不多。再发布(包括很多常规的商业再发布)必须被允许,不管是以在线形式还以书面形式,以便手册可以伴随着程序的每一份拷贝。

允许有关技术性方面的内容的更正也是至关重要的。当人们更改软件,添加或改变其某些特性时,如果他们负责任的话,也将会修改相应的手册——因而,他们能够为修改过的程序提供准确而清晰的文档。某个手册的页数你是无法决定的,但是为某个程序的变更版本写一份全新的手册,对于我们的社区来说,那真是没有必要。

在改进过程中所运用的某些限制是合理的。例如,要求保持原作者的版权通告、发布条款、以及作者名单,是没有问题的。在修正版本中包含是他们更正的通告也是没有问题的。只要论述的是非技术性的话题(就像这一章),可以接受连续完整的章节不可删除或被更改。能够接受这些限制,是因为它们不会妨碍社区对手册的正常使用。

无论如何,必须允许对手册中所有关技术性方面的内容进行修改,然后通过所有正常的通道,利用所有常规的媒质,发布这个结果。否则,这些限制就妨碍了对手册的使用,那么它就是非自由的了,我们就得需要一个新的手册来代替它了。

请散布有关这一论点的言辞。我们的社区仍然在遗失好多手册,这些手册都在成为私有出版物。如果我们趁早散布自由软件急需自由参考手册和指南这样的言辞的话,也许下一个投稿人就会意识到,只有少数的手册投稿给了自由软件社区。

如果你正在撰写文档,请坚持在GNU的自由文档许可证或其他的自由许可证下出版它。别忘了,这个决策是需要争得你的赞同的——你不用理会出版社的决策。只要你坚持,某些出版社会使用自由许可证的,但是他们不能奢求有买卖的特权;那需要由你自己来发行,并且坚定地说:这就是你想要的。如果这个出版社拒绝了你的生意,那就再换一家。如果你不

能确定某个被提议的许可证是自由的,就写信给licensing@https://www.360docs.net/doc/002492034.html,。

你可以使用购买的方式来鼓励商业出版社出售更多的免费的,非赢利版权的手册与指南,尤其是购买那些来自于出版社的拷贝,付给他们撰写或作重大改进的费用。同时,尽量完全避免购买非自由的文档。在购买之前,先查看一下发布条款,不管谁要做你的生意都必须尊重你的自由。查看书的历史,设法奖励支付了作者们工资的那些出版社。

自由软件基金会在https://www.360docs.net/doc/002492034.html,/doc/other-free-books.html维护了一个已经由其他一些出版社出版了的文档的列表。

GDB的贡献者们

Richard Stallman是GDB的原作者,也是其他好多GNU程序的原作者。好多人已经对它的开发作了贡献。谨以此节来表彰那些主要的贡献者们。自由软件的一个优点就是每个人都无偿的为它作贡献。遗憾的是,我们无法逐一向他们表示感谢。在GDB的发布中,有一个“ChangeLog”文件,做了极为详尽的说明。

2.0版本以前的大量变化已湮灭在时间的迷雾中。

恳请:极力欢迎对本节的补充。如果您或您的朋友(或者是敌人,为了公平),不公平地在这个列表中被遗漏了,我们愿意加入您的名字。

为了使那些可能被遗忘的人们的工作不至于徒劳无功,在此特别感谢那些带领GDB走过各个重要发布版的那些人:Andrew Cagney(发布了6.1, 6.0, 5.3, 5.2, 5.1 和5.0版);Jim Blandy(发布了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 Stallman,在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. Henkel-Wallace、Rich Pixley、Steve Chamberlain和John Gilmore的一个合作项目。

David Johnson编写了最初的COFF支持。Pace Willison做了最初的压缩的COFF支持。

哈里斯计算机系统(Harris Computer Systems)的Brent Benson贡献了DW ARF 2的支持。

Adam de Boor 和Bradley Davis贡献了ISI Optimum V的支持。Per Bothner、Noboyuki Hikichi和Alessandro Forin 贡献了MIPS的支持。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贡献了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贡献了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,readline库的作者,正在提供命令行编辑与命令历史功能。

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(现在是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、Peter 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和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 Hunt、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、Ulrich 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 Tiemann、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 Kettenis、Grace Sainsbury、Kei

Sakamoto、Yoshinori Sato、Michael Snyder、Andreas Schwab、Jason Thorpe、Corinna Vinschen、Ulrich Weigand和Elena Zannoni的很多人,为把旧有的体系结构移植到这个新的框架上提供了帮助。

请发送FSF和GNU的疑问和问题到gnu@https://www.360docs.net/doc/002492034.html,。这也有一些其他的方式联系FSF。

这些页面是由GDB的开发者们维护的。

Copyright Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.。

只要保留这些信息,以任何媒质,一字不差地复制与分者这一整份文章是允许的。

本文是由GDB的管理员于2005年7月16日,使用text2html生成的。

1.一个简单的GDB会话

你可以在你的业余时间利用本手册了解有关GDB的一切。可是,少数几个命令,就足以开始使用调试器了。本章就阐明了那些命令。

GNU m4(一个普通的宏处理器)的一个初级版本表现出下列bug:有些时候,当我们改变它默认的引证串(quote string,译者注:也就是我们常说的引号)时,用于捕获一个在别处定义的宏的命令停止工作。在下列简短的m4会话中,我们定一个可扩展为0000的宏;然后我们利用m4內建的defx定义一个相同的东西bar。可是当我们把左引证串(open quote string,译者注:英文直译为开引证串)改为,右引证串(close quote string)改为时,相同的程序不能定义新的替代名baz:

$cd gnu/m4

$./m4

define(foo,0000)

foo

0000

define(bar,defn(`foo'))

bar

0000

changequote(,)

define(baz,defn(foo))

baz

C-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 6.3.50.20050716, Copyright 1999 Free Software Foundation, Inc...

(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命令,在GDB的控制下,我们开始了m4的运行。只要控制没有到达

m4_changequote子程序,程序就会像平常那样运行。

(gdb)run

Starting program: /work/Editorial/gdb/gnu/m4/m4

define(foo,0000)

foo

0000

为了引发断点,我们调用changequote。GDB暂停执行m4,显示中断处的上下文信息。

changequote(,)

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(next)向前执行到当前函数的下一行。

(gdb) n

882 set_quotes((argc >= 2) ? TOKEN_DATA_TEXT(argv[1])\

: nil,

set_quotes像是一个有希望的子程序。我们可以使用命令s(step)代替next进入到他的里面。Step转到任意子程序中要被执行的下一行,因此他进入了set_quotes。

(gdb)s

set_quotes (lq=0x34c78 "", rq=0x34c88 "")

at input.c:530

530 if (lquote != def_lquote)

显示器显示了目前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.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) s

0x3b5c 532 if (rquote != def_rquote)

(gdb) s

0x3b80 535 lquote = (lq == nil || *lq == '\0') ? \

def_lquote : xstrdup(lq);

(gdb) n

536 rquote = (rq == nil || *rq == '\0') ? def_rquote\

: xstrdup(rq);

(gdb) n

538 len_lquote = strlen(rquote);

最后以行看起来有点古怪;我们能够检查变量lquote和rquote,看看他们现在是不是我们新指定的左右引号。我们使用命令p来查看它们的值。

(gdb)p lquote

$1 = 0x35d40 ""

(gdb)p rquote

$2 = 0x35d50 ""

Lquote和rquote的确是新的左右引号。为了能够查看上下文,我们可以使用l(list)命令,围绕着当前行,显示十行源代码。

(gdb) l

533 xfree(rquote);

534

535 lquote = (lq == nil || *lq == '\0') ? def_lquote\

: xstrdup (lq);

536 rquote = (rq == nil || *rq == '\0') ? def_rquote\

: xstrdup (rq);

537

538 len_lquote = strlen(rquote);

539 len_rquote = strlen(lquote);

540 }

541

542 void

让我们单步执行,通过设置len_lquote和len_rquote的那两行,然后查看一下它们的值。

(gdb)n

539 len_rquote = strlen(lquote);

(gdb)n

540 }

(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 len_rquote=strlen(rquote)

$6 = 9

那足以修复与m4內建的defn一同使用新引号的问题吗?我们可以使用c(continue)命令使m4继续执行,然后试试刚开始时那个有问题的例子:

(gdb) c

Continuing.

define(baz,defn(foo))

baz

0000

成功了!新的引号已经可以象默认的一样工作了。问题看来就是两个输入错误导致了错误的长度计算造成的。我们输入一个EOF让m4退出。

C-d

Program exited normally.

“Program exited normally”是GDB发出的。它表明m4已经结束执行了。我们可以使用GDB的quit命令结束我们的GDB会话。

(gdb) quit

2.征服GDB的进与出

本章讨论如何启动GDB,并且如何离开GDB。要点为:

●输入“gdb”启动GDB

●输入quit或C-d退出GDB

2.1调用GDB如何启动GDB

2.2退出GDB如何退出GDB

2.3 Shell命令如何在GDB中使用Shell命令

2.4 Loging输出如果把GDB的输出记录成为一个文件

2.1调用GDB

通过运行gdb程序来调用GDB。一旦启动,GDB就开始从终端读取命令,直到你让它退出为止。

你也可以使用多种参数与选项来运行gdb,在一开始就能更多地为您定义调试环境。

对于命令行选项的描述,这里打算覆盖多种情况。在一些环境中,某些选项可能会不起作用。

启动GDB最常用的方法是使用一个参数,指定一个可执行程序:

gdb program

也可以指定一个可执行程序和一个core文件一起启动gdb:

gdb program core

如果你想调试一个运行中的程序,作为代替,你可以指定一个进程ID为第二个参数:gdb program 1234

将把GDB附着到进程1234(除非你也有一个名叫“1234”的文件;GDB总是先检查core文件)。

运动第二个命令行参数需要一个相当完整的操作系统;当我们利用GDB作为远程调试器附着到一个裸板上时,那里可能没有任何“进程”的概念,那也就常常无法获得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的启动。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读取的第一个参数,如果没有关联的选项标志,就等同于“-se”选项后面参数;如果有第二个这样的参数的话,就等同于“-c”/“-p”选项后的参数)如果第二个参数是以一个10进制数开头的话,GDB首先会尝试把它作为一个进程去附着,如果失败了的话,就尝试着把它作为core文件打开。如果有一个文件名以数字开头的core文件的话,可用通过附加./前缀来避免GDB把它当成pid,如./12345。

如果GDB已经被配置为不支持core文件,比如大部分的嵌入式目标,它将拒绝第二个参数而忽略它。

大部分的选项都有长格式和短格式;都被展示在下表中。GDB也能识别不完整的长格式,只要与给出的各个选项之间没有歧义就行。(如果你愿意,你可以使用“--”来标记选项参数,而不用“-”,虽然我们展示的是更常用的约定)。

-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。如果没有这个进程,GDB就尝试着

打开一个名为number的core文件。

-command file

-x file

执行文件file中的GDB命令。参见命令文件一章

-directory directory

-d directory

添加directory到原文件搜索路径。

-m

-mapped

警告:这个选项依赖于操作系统的功能,并不被所有的操作系统所支持。

如果你的操作系统可以通过mmap系统调用使用内存映射文件(memory-mapped

files),你就可以利用这个选项,让GDB把你程序的符号写到当前目录下的一个

可重用文件(reusable file)中。如果你正调试程序是“/tmp/fred”,那么对应的

符号文件就是“/tmp/fred.syms”。之后的GDB调试会话会注意这个文件的存在,

并且快速的映射它的符号信息,而不需要从可执行程序的符号表中读取。

“.syms”文件特属于GDB所运行的主机。它保存着GDB内部符号表的精确映像。

它不能被多个主机平台交叉共享。

-r

-readnow

立即读取每一个符号文件的整个符号表,不同于默认的根据需要而逐步读取。这

使得启动会更慢,但之后的操作会更快。

为了创建一个包换完整符号信息的“.syms”文件,典型的做法是-mapped与-readnow 联合使用(参见文件指定命令一章,有关“.syms”文件的资料)。一个简单的创建一个“.symes”文件以便以后使用的GDB调用是:

gdb -batch -nx -mapped -readnow programname

2.1.2 选择模式

可以以两种模式中的一种运行GDB——批处理模式或单调模式。

-nx

-n

不执行在任何初始化文件中找到的命令。默认情况下,GDB会在处理完所有命令选

项与参数之后执行这些文件里的命令。参见命令文件一章。

-quiet

-silent

-q

“单调”。不打印介绍性信息和版权信息。这些信息在批处理模式下也是不打印的。

-batch

以批处理模式运行。处理完所有由“-x”所指定的命令文件(如果不使用“-n”

来约束,还有所有的初始化文件)后以状态0退出。在执行命令文件中的命令过程中,如果发生错误,则以非0状态退出。

GDB作为一个过滤器运行时,批处理模式可能会有用,例如,在另外一台计算机上下载并运行一段程序;为了使这个更有用,消息

Program exited normally.

(只要程序是在GDB的控制下运行终止的,一般都会使这个结果)说明批处理模式下的运行是没有问题。

-nowindows

-nw

“无窗口”。倘若GDB伴随有一个图形用户界面(GUI),这时这个选项就告诉GDB仅使用命令行界面。如果没有GUI可用,这个选项也就没有作用。

-windows

-w

如果GDB含有一个GUI的话,那么这个选项就是请求:如果可能的话,就使用它。

-cd directory

用directory代替当前的目录,作为GDB的运行工作目录运行。

-fullname

-f

当GDB作为GNU Emacs的子进程运行时,设置这个选项。他告诉GDB以某一标准输出完整的文件名和行号,以便每次都能以大家公认方式显示栈结构(这也包括每次程序停止时)。这个公认的格式为:两个“\032”字符后面跟着一个文件名,行号和字符位置以颜色区分,外加一个换行。Emacs-to-GDB的接口程序利用两个“\032”字符作为显示栈结构源代码的信号。

-epoch

当GDB作为Epoch Emacs-GDB接口的子进程运行时,设置这个选项。它告诉GDB 修改它的打印程序,以便Epoch可以在分割窗口中显示表达式的值。

-annotate level

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

这个注释机制在很大程度上已被GDB/MI所代替(参见24.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通讯

的程序作为它的一个后端程序。参见命令解释器一章。

“--interpreter=mi”(或者“--interpreter=mi2“)让GDB使用其6.0版以后包含的GDB/MI接口(参见GDB/MI接口一章)。之前包含在GDB 5.3中的GDB/MI 接口使用“--interpreter=mi1”选择,但不赞成使用。早期的GDB/MI接口已经不提供支持了。

-write

打开可执行文件和Core文件,可读可写。这相当于GDB里面的“set write on”

命令。(参见14.6修补程序一节)

-statistics

这个选项让GDB在完成每个命令并返回到提示符后,打印有关时间和内存使用率的统计。

-version

这个选项让GDB打印它的版本号和“无担保”内容后退出。

2.1.3 启动期间,GDB做了什么

这里是GDB在会话启动期间做了什么的描述:

1.按照命令行的规定,准备命令解释器(参见解释器一章)。

2.在你的HOME目录中读取初始化文件(如果有),这行那个文件里的所有命令。

3.处理命令行选项和操作对象。

4.读取并执行当前工作目录中初始化文件(如果有)中的命令。仅在工作目录与HOME目录不同时这样做。因此,可以拥有不止一个初始化文件。在HOME目录下的是一个普通的,另外一个,在调用GDB的目录下的,是专用于程序调试的。

5.读取由“-x”选项所指定的命令文件。要获得有关GDB命令文件的详细信息,请参考20.3命令文件一节。

6.读取历史文件中的命令历史记录。要获得有关命令历史以及GDB用于记录它的文件的详细信息,请参考19.3命令历史一节。

初始化文件与命令文件使用相同的语法(见20.3命令文件一节),而且在GDB中也是以相同的方法处理。在HOME目录下的初始化文件可以设置那些能够影响后续的命令行选项处理的选项(比如“set complaints”)。如果使用了“-nx”选项(参见选择模式一节),初始化文件就不会被执行。

GDB的初始化文件通常被命名为“.gdbinit”。在某些GDB的配置中,初始化文件可以是其它的名字(有些典型的环形,有一个GDB的专有形式需要与其他的形式并存,因此,给专有版本的初始文件一个不同的名字)。这些使用特殊初始化文件名的环境有:

●GDB的DJGPP移植使用的是“gdb.ini”,这是由于受到DOS文件系统对文件名的

强制限制。GDB的Windows移植采用的是标准名,而且一旦发现“gdb.ini”文件,

它会发出警告,建议把这个文件更改为标准名。

●VxWorks(风河Systems的实时操作系统):“.vxgdbinit”

●OS68K(Enea Data Systems的实时操作系统):“.os68gdbinit”

●ES-1800(爱立信电信AB M68000仿真器):“.esgdbinit”

●CISCO 68k:“.cisco-gdbinit”

2.2 退出GDB

quit [expression]

q

使用quit(缩写q)命令退出GDB,或者键入一个文件结束符(通常是C-d)。

如果你不提供expression,GDB会正常的结束;否则,它会以expression的结果

作为错误代码结束。

中断(通常是C-c)不会使GDB退出,而是终止了在进程中所有GDB命令的动作,并返回到GDB的命令层。在任何时候键入中断符都是安全的,因为GDB在不安全的时候是不会使它生效的。

如果你曾用GDB控制一个被附着的进程或设备的话,你可以使用detach命令释放它(参见调试一个早以运行的进程一章)。

gdb手册

GDB用户手册 目录 目录 (1) 摘要 (2) 自由软件 (2) 自由软件急需自由文档 (2) GDB的贡献者们 (4) 1.一个简单的GDB会话 (8) 2.征服GDB的进与出 (13) 2.1调用GDB (13) 2.1.1 选择文件 (14) 2.1.2 选择模式 (16) 2.1.3 启动期间,GDB做了什么 (19) 2.2 退出GDB (20) 2.3 Shell命令 (21) 2.4 Loging输出 (21) 3.GDB命令 (22) 3.1命令语法 (22) 3.2命令完成 (23) 3.3获得帮助 (25) 4.在GDB下运行程序 (29) 4.1 适合调试的编译 (29) 4.2 启动程序 (30) 4.3 程序的参数 (32) 4.4 程序的环境 (32) 4.5 程序的工作目录 (34) 4.6 程序的输入输出 (35) 4.7 调试某个已运行的进程 (36) 4.8 杀掉子进程 (37) 4.9 多线程程序的调试 (37) 4.10 多进程程序的调试 (40) 5.0停止与继续 (42)

摘要 象GDB这样的调试程序,目的就是让你可以查看其它程序的内部运行过程,或者是在它崩溃的那一时刻它在做什么。 GDB能做4件事(这些还需附加其他的一些事),帮助你捕获在场的错误: ·启动程序,设定任何可以影响它行为的东西。 ·在特定的条件下使程序停止。 ·当程序停止时,分析发生了什么。 ·改变程序里的一些东西,进行一个由于bug所导致的结果的矫正性试验,同时继续了解另外一个bug。 可以使用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运行时库,也可以使用GNU Objective-C运行时库。 自由软件 GDB是自由软件,受GNU公共许可证(GPL)保护。GPL给予了你自由复制或改编程序的许可——就是说获得拷贝的人也就获得了自由修改它的权利(这意味着他们必须有权访问源代码),而且可以自由的发布更多的拷贝。大部分软件公司所使用的版权限制了你的自由。自由软件基金会利用GLP保护了这些自由。 基本上来说,公共许可证是一个说明你拥有这些自由的许可证,而且你不能把这些自由从任何人那里占为己有。 自由软件急需自由文档 当今的自由软件社区所存在的最大缺憾不在于软件——而在于没有我们可以随同自由

如何高效使用GDB断点

在gdb中,断点通常有三种形式 断点(BreakPoint): 在代码的指定位置中断,这个是我们用得最多的一种。设置断点的命令是break,它通常有如下方式: 可以通过info breakpoints [n]命令查看当前断点信息。此外,还有如下几个配套的常用命令: 观察点(WatchPoint): 在变量读、写或变化时中断,这类方式常用来定位bug。

捕捉点(CatchPoint): 捕捉点用来补捉程序运行时的一些事件。如:载入共享库(动态链接库)、C++的异常等。通常也是用来定位bug。 捕捉点的命令格式是:catch ,event可以是下面的内容 自动删除。 捕捉点信息的查看方式和代码断点的命令是一样的,这里就不多介绍了。 在特定线程中中断 你可以定义你的断点是否在所有的线程上,或是在某个特定的线程。GDB很容易帮你完成这一工作。

break thread break thread if ... linespec指定了断点设置在的源程序的行号。threadno指定了线程的ID,注意,这个ID是GDB分配的,你可以通过"info threads"命令来查看正在运行程序中的线程信息。如果你不指定thread 则表示你的断点设在所有线程上面。你还可以为某线程指定断点条件。如: (gdb) break frik.c:13 thread 28 if bartab > lim 当你的程序被GDB停住时,所有的运行线程都会被停住。这方便你你查看运行程序的总体情况。而在你恢复程序运行时,所有的线程也会被恢复运行。那怕是主进程在被单步调试时。 在特定条件下中断 条件断点的一种特殊场景是在断点命中指定次数后停下来。事实上每个断点都有一个 ignore count, 他是一个正整数。通常情况下它的值为0,所以看不出来它的存在。但是如果它是一个非0值, 那么它将在每次命中后都将 count 减 1,直到它为 0. ignore bnum count 恢复程序运行和单步调试 在gdb中,和调试步进相关的命令主要有如下几条: 参考资料

实例—使用gdb调试器

2.4 实例—使用gdb调试器 1.编写实例程序gcctest.c,见2.2小节的开头部分 2.编译 3.启动GDB,执行程序 启动gdb,进入gdb调试环境,可以使用gdb的命令对程序进行调试。 [root@localhost gdbtest txt]# gdb //启动gdb GNU gdb Fedora (6.8-27.el5) Copyright (C) 2008 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i386-redhat-linux-gnu". (gdb) run gcctest //在gdb中,运行程序使用r或是run命令,注意,gcctest没有调试信息Starting program: gcctest No executable file specified. Use the "file" or "exec-file" command. //要使用file或exec-file命令指出要运行的程序 (gdb) file gcctest //使用file命令指出要运行的程序gcctest,注意,对gdb命令也可以使用Tab gcctest gcctest.c gcctestg (gdb) file gcctest //使用file命令指出要运行的程序gcctest Reading symbols from /root/Desktop/gdbtest txt/gcctest...(no debugging symbols found)...done. (gdb) r //在gdb中,运行程序使用r或是run命令 Starting program: /root/Desktop/gdbtest txt/gcctest gcctest (no debugging symbols found) (no debugging symbols found) (no debugging symbols found) hello in main hello 1 hello 2 sum=54125560035401396161080590579269632.000000 Program exited with code 057. (gdb) file gcctestg //使用file命令指出要运行的程序gcctestg Reading symbols from /root/Desktop/gdbtest txt/gcctestg...done. (gdb) r //在gdb中,运行程序使用r或是run命令 Starting program: /root/Desktop/gdbtest txt/gcctestg gcctest hello in main hello 1 hello 2 sum=54125560035401396161080590579269632.000000 Program exited with code 057. (gdb) q //使用q或是quit命令退出gdb [root@localhost gdbtest txt]# 4.GDB命令简介

国嵌视频教程下载

嵌入式Linux视频教程 相关搜索:简体中文, 学习方法, 视频教程, 普通话, 嵌入式 中文名: 嵌入式Linux视频教程 资源格式: 光盘镜像 学校: 成都国嵌嵌入式培训中心版本: 成都国嵌嵌入式培训中心的基于广州友善之发行日期: 2010年 地区: 大陆 对白语言: 普通话 文字语言: 简体中文 视频光盘目录结构 国嵌视频1.iso -学习方法与课程体系介绍(学前必看) -学习方法介绍.avi -国嵌嵌入式课程体系.pdf -嵌入式Linux学习方法.pdf -国嵌课程1-嵌入式入门体验班(上) -第1天(嵌入式系统概述) -国嵌体验入门班-1-1(嵌入式系统概述).avi -国嵌体验入门班-1-2(ARM概述).avi -国嵌体验入门班-1-3(嵌入式Linux概述).avi -国嵌体验入门班-1-4(2440开发板介绍).avi -国嵌体验入门班-1-5(软硬件环境搭建).avi -第2天(开发板快乐体验) -国嵌体验入门班-2-1(开发板系统安装).avi -国嵌体验入门班-2-1(开发板系统安装-Jlink方式).avi -国嵌体验入门班-2-1(开发板系统安装-并口方式).avi -国嵌体验入门班-2-2(裸机程序体验).avi -国嵌体验入门班-2-3(QT系统体验).avi -国嵌体验入门班-2-4(Android系统体验).avi 国嵌视频2.iso

-国嵌课程1-嵌入式入门体验班(下) -第3天(Linux系统体验) -国嵌体验入门班-3-1(Linux定制安装).avi -国嵌体验入门班-3-2(Linux命令).avi -国嵌体验入门班-3-3(VI使用).avi -国嵌体验入门班-3-4(Linux系统管理).avi -国嵌体验入门班-3-5(Shell编程).avi -国嵌体验入门班-3-6(Qcd功能演示).avi -国嵌体验入门班-3-7(必修实验).avi -国嵌课程2-嵌入式Linux应用开发班 -第1天(编程基础) -国嵌应用班-1-1(GCC程序编译).avi -国嵌应用班-1-2(GDB程序调试).avi -国嵌应用班-1-3(makefile工程管理).avi -国嵌应用班-1-4(必修实验).avi -第2天(文件时间编程) -国嵌应用班-2-1(系统调用方式访问文件).avi -国嵌应用班-2-2(库函数访问文件).avi -国嵌应用班-2-3(时间编程).avi -国嵌应用班-2-4(必修实验).avi -第3天(多进程程序设计) -国嵌应用班-3-1(进程控制原理).avi -国嵌应用班-3-2(进程控制程序设计).avi -国嵌应用班-3-3(必修实验).avi -第4天(进程间通讯) -国嵌应用班-4-1(进程间通讯概述).avi -国嵌应用班-4-2(管道通讯).avi -国嵌应用班-4-3(信号通讯).avi -国嵌应用班-4-4(共享内存通讯).avi -国嵌应用班-4-5(必修实验).avi -第5天(进程间通讯) -国嵌应用班-5-1(消息队列).avi

实验一LinuxC编程工具GCC和GDB

淮海工学院计算机工程学 实验报告书 评语: 成绩:指导教师: 批阅时间:年月

实验目的与要求 1. 掌握Linux C 开发过程中的基本概念; 2. 掌握如GCC GDB等开发工具的使用。 二、实验内容 1. 将参考代码录入到文件中,编译执行后发现结果与预期不一致,请使用GDE调试, 完成字符串反序输出功能。 三、参考源代码 #include <> #include <> #include <> int reverse_str(char *string); int main (void) { char string[] = "Linux C Tools : GCC and GDB"; printf ("The original string is %s \n", string); reverse_str (string); } int reverse_str (char *str) { char *new_str; int i, size; size = strlen (str); if((new_str = (char *) malloc (size + 1)) == NULL) { return -1; } for (i = 0; i < size; i++) new_str[size - i] = str[i]; new_str[size+1] = ' '; printf("The reversed string is %s\n",new_str); free(new_str); return 0 ; } 四、实验步骤 步骤1. 编辑源代码 mkdir test1 cd test1 gedit (1) 使用gedit 编辑器,建议课外学习vim; (2) 分析代码中语句功能。 步骤 2. 编译源代码

gdb单步调试(中)

一、设置断点(BreakPoint ) 我们用break 命令来设置断点。正面有几点设置断点的方法: break 在进入指定函数时停住。C++ 中可以使用class::function 或function(type,type) 格式来指定函数名。 break 在指定行号停住。 break +offset break -offset 在当前行号的前面或后面的offset 行停住。offiset 为自然数。 break filename:linenum 在源文件filename 的linenum 行处停住。 break filename:function 在源文件filename 的function 函数的入口处停住。 break *address 在程序运行的内存地址处停住。 break break 命令没有参数时,表示在下一条指令处停住。 break ... if ... 可以是上述的参数,condition 表示条件,在条件成立时停住。比如在循环境体中,可以设置break if i=100 ,表示当i 为100 时停住程序。 查看断点时,可使用info 命令,如下所示:(注:n 表示断点号) info breakpoints [n] info break [n] 二、设置观察点(WatchPoint ) 观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序。我们有下面的几种方法来设置观察点: watch 为表达式(变量)expr 设置一个观察点。一量表达式值有变化时,马上停住程序。 rwatch

Ubuntu下Vim GCC GDB安装及使用

Ubuntu下Vim+GCC+GDB安装及使用 一)安装 vim)打开命令行运行sudo apt-get install vim,并按提示输入管理员密码。 gcc+gdb)输入命令行运行 sudo apt-get install build-essential build-essential包含gcc和gdb等工具,是C语言的开发包。 安装完了可以执行 gcc --version 的命令来查看版本,输出如下: gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2 Copyright (C) 2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 则表明安装好了。 二)常用编译命令选项 假设源程序文件名为test.c。 1. 无选项编译链接 用法:#gcc test.c 作用:将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。 2. 选项 -o 用法:#gcc test.c -o test 作用:将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。 3. 选项 -E 用法:#gcc -E test.c -o test.i 作用:将test.c预处理输出test.i文件。 4. 选项 -S 用法:#gcc -S test.i 作用:将预处理输出文件test.i汇编成test.s文件。 5. 选项 -c 用法:#gcc -c test.s 作用:将汇编输出文件test.s编译输出test.o文件。 6. 无选项链接 用法:#gcc test.o -o test

gbd调试

用GDB调试程序 GDB概述 ———— GDB 是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UN IX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。 一般来说,GDB主要帮忙你完成下面四个方面的功能: 1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。 2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式) 3、当程序被停住时,可以检查此时你的程序中所发生的事。 4、动态的改变你程序的执行环境。 从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。让我们一一看来。 一个调试示例 —————— 源程序:tst.c

1 #include 2 3 int func(int n) 4 { 5 int sum=0,i; 6 for(i=0; i cc -g tst.c -o tst 使用GDB调试:

GDB命令大全

GDB命令大全 GDB的使用 当程序出错并产生core 时 快速定位出错函数的办法 gdb 程序名 core文件名(一般是core,也可能是core.xxxx) 调试程序使用的键 r run 运行.程序还没有运行前使用 c cuntinue 继续运行。运行中断后继续运行 q 退出 kill 终止调试的程序 h help 帮助 命令补全功能 step 跟入函数 next 不跟入函数

b breakpoint 设置断点。 用法: b 函数名对此函数进行中断 b 文件名:行号对此文件中指定行中断.如果是当前文件,那么文件名与:号可以省略 看当前断点数使用info break.禁止断点disable 断点号.删除delete 断点号. l list 列出代码行。一次列10 行。连接使用list将会滚动显示. 也可以在list 后面跟上文件名:行号 watch 观察一个变量的值。每次中断时都会显示这个变量的值 p print 打印一个变量的值。与watch不同的是print只显示一次 这里在顺便说说如何改变一个 value. 当你下指令 p 的时候,例如你用 p b, 这时候你会看到 b 的 value, 也就是上面的 $1 = 15. 你也同样可以用 p 来改变一个 value, 例如下指令 p b = 100 试试看,

这时候你会发现, b 的 value 就变成 100 了:$1 = 100. 网上抄录 基本的使用方法简介 前言 程序代码中的错误可分为数类,除了最容易除错的语法错误,编译程序会告诉你错误所在外,大部分的错误都可以归类为执行时错误。GDB 的功能便是寻找执行时错误。如果没有除错程序,我们只能在程序中加入输出变量值的指令来了解程序执行的状态。有了 GDB 除错程序,我们可以设定在任何地方停止程序的执行,然后可以随意检视变量值及更动变量,并逐行执行程序。 一个除错程序执行的流程通常是这样的: 1. 进入除错程序并指定可执行文件。 2. 指定程序代码所在目录。 3. 设定断点后执行程序。 4. 程序于断点中断后,可以 (1)检视程序执行状态;检视变量值或变更变量值 (2) 逐步执行程序,或是全速执行程序到下一个断点或是到程序结束为止。 5. 离开除错程序。 以下将分为下列数项分别介绍:

GDB调试精粹及使用实例

GDB调试精粹及使用实例 一:列文件清单 1. List (gdb) list line1,line2 二:执行程序 要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和>)和外壳通配符(*、?、[、])在内。 如果你使用不带参数的run命令,gdb就再次使用你给予前一条run命令的参数,这是很有用的。 利用set args 命令就可以修改发送给程序的参数,而使用show args 命令就可以查看其缺省参数的列表。 (gdb)set args –b –x (gdb) show args backtrace命令为堆栈提供向后跟踪功能。 Backtrace 命令产生一张列表,包含着从最近的过程开始的所以有效过程和调用这些过程的参数。 三:显示数据 利用print 命令可以检查各个变量的值。 (gdb) print p (p为变量名) whatis 命令可以显示某个变量的类型 (gdb) whatis p type = int * print 是gdb的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。表达式除了包含你程序中的变量外,还可以包含以下内容: l 对程序中函数的调用 (gdb) print find_entry(1,0) l 数据结构和其他复杂对象 (gdb) print *table_start $8={e=reference=’\000’,location=0x0,next=0x0} l 值的历史成分 (gdb)print $1 ($1为历史记录变量,在以后可以直接引用 $1 的值) l 人为数组 人为数组提供了一种去显示存储器块(数组节或动态分配的存储区)内容的方法。早期的调试程序没有很好的方法将任意的指针换成一个数组。就像对待参数一样,让我们查看内存中在变量h后面的10个整数,一个动态数组的语法如下所示: base@length 因此,要想显示在h后面的10个元素,可以使用h@10: (gdb)print h@10 $13=(-1,345,23,-234,0,0,0,98,345,10)

最新GDB学习资料

GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。 用GDB调试程序 GDB概述 ———— GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。 一般来说,GDB主要帮忙你完成下面四个方面的功能: 1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。 2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式) 3、当程序被停住时,可以检查此时你的程序中所发生的事。 4、动态的改变你程序的执行环境。 从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。让我们一一看来。 一个调试示例 —————— 源程序:tst.c 1 #include 2 3 int func(int n) 4 { 5 int sum=0,i; 6 for(i=0; i cc -g tst.c -o tst 使用GDB调试: hchen/test> gdb tst <---------- 启动GDB GNU gdb 5.1.1 Copyright 2002 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or 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. This GDB was configured as "i386-suse-linux"... (gdb) l <-------------------- l命令相当于list,从第一行开始例出原码。 1 #include 2 3 int func(int n) 4 { 5 int sum=0,i; 6 for(i=0; i

GDB常用命令

附录A:GDB使用 1.基本命令 1)进入GDB #gdb test test是要调试的程序,由gcctest.c -g -o test生成。进入后提示符变为(gdb) 。 2)查看源码(gdb) l 源码会进行行号提示。 如果需要查看在其他文件中定义的函数,在l后加上函数名即可定位到这个函数的定义及查看附近的其他源码。或者:使用断点或单步运行,到某个函数处使用s进入这个函数。 3)设置断点(gdb) b 6 这样会在运行到源码第6行时停止,可以查看变量的值、堆栈情况等;这个行号是gdb的行号。 4)查看断点处情况(gdb) info b 可以键入"info b"来查看断点处情况,可以设置多个断点; 5)运行代码(gdb) r 6)显示变量值(gdb) p n 在程序暂停时,键入"p 变量名"(print)即可; GDB在显示变量值时都会在对应值之前加上"$N"标记,它是当前变量值的引用标记,以后若想再次引用此变量,就可以直接写作"$N",而无需写冗长的变量名; 7)观察变量(gdb) watch n 在某一循环处,往往希望能够观察一个变量的变化情况,这时就可以键入命令"watch"来观察变量的变化情况,GDB在"n"设置了观察点; 8)单步运行(gdb) n 9)程序继续运行(gdb) c 使程序继续往下运行,直到再次遇到断点或程序结束; 10)退出GDB (gdb) q 2.断点调试 break+设置断点的行号,break n,在n行处设置断点; tbreak+行号或函数名,tbreak n/func,设置临时断点,到达后被自动删除; break+filename+行号, break main.c:10,用于在指定文件对应行设置断

GDB调试及实例

GDB调试及实例 一:列文件清单 1.List (gdb) list line1,line2 二:执行程序 要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和>)和外壳通配符(*、?、[、])在内。 如果你使用不带参数的run命令,gdb就再次使用你给予前一条run命令的参数,这是很有用的。 利用set args 命令就可以修改发送给程序的参数,而使用show args 命令就可以查看其缺省参数的列表。 (gdb)set args –b –x (gdb) show args backtrace命令为堆栈提供向后跟踪功能。 Backtrace 命令产生一张列表,包含着从最近的过程开始的所以有效过程和调用这些过程的参数。 三:显示数据 利用print 命令可以检查各个变量的值。 (gdb) print p (p为变量名) whatis 命令可以显示某个变量的类型 (gdb) whatis p type = int * print 是gdb的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。表达式除了包含你程序中的变量外,还可以包含以下内容: l 对程序中函数的调用 (gdb) print find_entry(1,0) l 数据结构和其他复杂对象 (gdb) print *table_start $8={e=reference=’\000’,location=0x0,next=0x0} l 值的历史成分 (gdb)print $1 ($1为历史记录变量,在以后可以直接引用$1 的值) l 人为数组 人为数组提供了一种去显示存储器块(数组节或动态分配的存储区)内容的方法。早期的调试程序没有很好的方法将任意的指针换成一个数组。就像对待参数一样,让我们查看内存中在变量h后面的10个整数,一个动态数组的语法如下所示: base@length 因此,要想显示在h后面的10个元素,可以使用h@10: (gdb)print h@10 $13=(-1,345,23,-234,0,0,0,98,345,10)

ARM汇编指令调试方法

ARM汇编指令调试方法 学习ARM 汇编时,少不了对ARM 汇编指令的调试。作为支持多语言的 调试器,gdb 自然是较好的选择。调试器工作时,一般通过修改代码段的内容 构造trap 软中断指令,实现程序的暂停和程序执行状态的监控。为了在x86 平 台上执行ARM 指令,可以使用qemu 模拟器执行ARM 汇编指令。一、准备ARM 汇编程序首先,我们构造一段简单的ARM 汇编程序作为测试代码 main.s。 .globl _start_start:mov R0,#0swi0x00901 以上汇编指令完成了0 号系统调用exit 的调用。mov 指令将系统调用号传入寄存器R0,然后使用0x00901 软中断 陷入系统调用。 为了运行ARM 汇编代码,需要使用交叉编译器arm-linux-gcc 对ARM 汇编 代码进行编译。下载交叉编译器安装完毕后,对ARM 汇编代码进行编译。 arm-linux-gcc main.s -o main -nostdlib 编译选项-nostdlib 表示不使用任何运行时库文件,编译生成的可执行文件main 只能在ARM 体系结构的系统上运行。二、编译安装qemu 模拟器为了x86 的Linux 系统内运行ARM 体系结构的可 执行程序,需要安装qemu 模拟器。 首先下载qemu 源码,然后保证系统已经安装了flex 和bison。 编译安装qemu。 ./configure --prefix=/usrsudo make && make install 然后使用qemu 的ARM 模拟器执行ARM 程序。 qemu ./main 三、编译安装arm-gdb 为了调试ARM 程序,需要使用gdb 的源码编译生成arm-gdb。 首先下载gdb 源代码,编译安装。

如何在Linux中使用gdb调试C程序

如何在Linux中使用gdb调试C程序 无论多么有经验的程序员,开发的任何软件都不可能完全没有bug。因此,排查及修复bug 成为软件开发周期中最重要的任务之一。有许多办法可以排查bug(测试、代码自审等等),但是还有一些专用软件(称为调试器)可以帮助准确定位问题的所在,以便进行修复。 如果你是C/C++ 程序员,或者使用Fortran 和Modula-2 编程语言开发软件,那么你将会很乐意知道有这么一款优秀的调试器- GDB - 可以帮你更轻松地调试代码bug 以及其它问题。在这篇文章中,我们将讨论一下GDB 调试器的基础知识,包括它提供的一些有用的功能/选项。 在我们开始之前,值得一提的是,文章中的所有说明和示例都已经在Ubuntu 14.04 LTS 中测试过。教程中的示例代码都是 C 语言写的;使用的shell 为bash(4.3.11);GDB 版本为7.7.1。 GDB 调试器基础 通俗的讲,GDB 可以让你看到程序在执行过程时的内部流程,并帮你明确问题的所在。我们将在下一节通过一个有效的示例来讨论GDB 调试器的用法,但在此之前,我们先来探讨一些之后对你有帮助的基本要点。 首先,为了能够顺利使用类似GDB 这样的调试器,你必须以指定的方式编译程序,让编译器产生调试器所需的调试信息。例如,在使用gcc 编译器(我们将在本教程之后的章节用它来编译C 程序示例)编译代码的时候,你需要使用 -g 命令行选项。 IT网,http://it 想要了解gcc 编译器手册页中关于 -g 命令行选项相关的内容,请看这里。 下一步,确保在你的系统中已经安装GDB 调试器。如果没有安装,而且你使用的是基于Debian 的系统(如Ubuntu),那么你就可以使用以下命令轻松安装该工具: sudo apt-get install gdb 在其他发行版上的安装方法,请看这里。 现在,当你按照上述的方式编译完程序(gcc -g 命令行选项),同时也已经安装好GDB 调

linux环境下的调试命令

Linux下GDB调试命令_1 2008-11-21 18:39 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,不过现在在Linux下也可以用了。它使你能在程序运行时观察程和内存的使用情况。Linux不比Windows,没有那么多方便的图形界面方式的,像.Net、Eclipse等IDE的调试器。但上天逼着我在Li 软件,用了一段时间,你会发现GDB这个调试工具一点不比其它的差,所谓“寸有所长,尺有所短”就是这个道理。 一般来说,我可以用GDB来: ?加载程序 ?设置监视点、断点、入口条件等 ?动态的改变你程序的执行环境 ?单步调试、追踪 一、加载文件 启动GDB的方法有以下几种: 1、>gdb [exe] 2、>gdb pid [pid] GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb -help查看。我在下面只例举一些比较常用的参数: -symbols -s 从指定文件中读取符号表。 -se file 从指定文件中读取符号表信息,并把他用在可执行文件中。 -core -c 调试时core dump的core文件。 -directory -d 加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径。 二、运行命令 当以gdb 方式启动gdb后,gdb会在PATH路径和当前目录中搜索的源文件。 在gdb中,运行程序使用r或是run命令。程序的运行,你有可能需要设置下面四方面的事。 1、程序运行参数。 set args 可指定运行时参数。(如:set args 10 20 30 40 50) show args 命令可以查看设置好的运行参数。 2、运行环境。 path 可设定程序的运行路径。 show paths 查看程序的运行路径。 set environment varname [=value] 设置环境变量。如:set env USER=hchen show environment [varname] 查看环境变量。 3、工作目录。 cd 相当于shell的cd命令。 pwd 显示当前的所在目录。 4、程序的输入输出。

GDB基本命令

1. 本文介绍使用gdb调试程序的常用命令。 主要内容: [简介] [举例] [其他] [简介] ============= GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。同时GDB也具有例如ddd这样的图形化的调试端。 一般来说,GDB主要完成下面四个方面的功能: (1)启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。 (2)可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式) (3)当程序被停住时,可以检查此时你的程序中所发生的事。 (4)动态的改变你程序的执行环境。 [举例] ============= *启动gdb $gdb 这样可以和gdb进行交互了。 *启动gdb,并且分屏显示源代码: $gdb -tui 这样,使用了'-tui'选项,启动可以直接将屏幕分成两个部分,上面显示源代码,比用list方便多了。这时候使用上下方向键可以查看源代码,想要命令行使用上下键就用[Ctrl]n和[Ctrl]p. *启动gdb调试指定程序app: $gdb app 这样就在启动gdb之后直接载入了app可执行程序,需要注意的是,载入的app程序必须在编译的

时候有gdb调试选项,例如'gcc -g app app.c',注意,如果修改了程序的源代码,但是没有编译,那么在gdb中显示的会是改动后的源代码,但是运行的是改动前的程序,这样会导致跟踪错乱的。 *启动程序之后,再用gdb调试: $gdb 这里,是程序的可执行文件名,是要调试程序的PID.如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。 *启动程序之后,再启动gdb调试: $gdb 这里,程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID,是要调试程序的PID.这样gdb就附加到程序上了,但是现在还没法查看源代码,用file命令指明可执行文件就可以显示源代码了。 **启动gdb之后的交互命令: 交互命令支持[Tab]补全。 *显示帮助信息: (gdb) help *载入指定的程序: (gdb) file app 这样在gdb中载入想要调试的可执行程序app。如果刚开始运行gdb而不是用gdb app启动的话可以这样载入app程序,当然编译app的时候要加入-g调试选项。 *重新运行调试的程序: (gdb) run 要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和> )和shell通配符(*、?、[、])在内。

用GDB调试程序--调试器GDB常用功能

一,GDB调试器简介 GDB是Linux下的常用调试器,主要用于调试源代码、调试运行中的进程和查看core dump文件。Linux下的调试器主要有gdb、cgdb、ddd、eclipse。GDB调试器的运行速度快、能够进行源代码同步显示。 使用-tui 选项开启gdb命令输入和源代码的分屏显示,tui即Terminal User Interface。 二,GDB常用调试命令 a)调试可执行文件 以源代码为/home/zebra/目录下的test.c文件产生的可执行文件test为例(可执行文件使用gcc进行编译,并使用-g选项以产生调试信息),进行命令的说明(详细源代码参见第三部分:三,调试实例分析 )。 gdb调试源代码流程: 1,开启gdb程序,即运行如下命令:gdb -q (-q用以使得gdb不输出gdb程序的版本等信息)2,指定调试的二进制文件:file test 3,list查看源代码 4,设定断点breakpoint main breakpoint sub 上述分别在main函数和sub函数处设定了断点。 断点可以设置在任意已知源代码文件的某一行,某一个函数,同时可以指定是设置在哪个/哪些线程上(见下边描述)。 5,运行可执行文件: run 6,这样程序会运行到断点处停止下来,gdb会打印当前断点的信息。 7,使用s 或者n进行单步调试。 s即step,n即next都是执行一条语句,然后停下来。 如果想执行一条汇编语句,则可以使用si ,ni,即step instruction,next instruction。 8,bt命令查看当前的调用栈,bt即backtrace。 9,info frame查看函数帧信息。 10,frame n 进入某个函数帧(编号为n) 11,info 命令可以对当前的函数帧的寄存器、局部变量、函数的参数进行查看。 info register;info local;info args。 12,disassemble对当前函数对应的二进制进行反汇编。 13,x/nfu address 查看内存其中address是内存开始的地址,从该地址向高地址增加, x是examinate的缩写,n表示重复次数,f表示输出格式,u表示内存大小的单位(默认是字,即4个字节)。 一般我都用x/nx address,即打印n个从address开始的内存,每个是4字节,以十六进制打印。14,continue,执行至该函数退出 15,info threads,显示当前可调试的所有线程 16,thread ,切换当前调试的线程为指定ID的线程break File:LineNumber thread if x==y。 17,thread apply command让一个/多个/所有线程执行GDB的命令command。

相关文档
最新文档