Debugging with gdb
The gnu Source-Level Debugger
Ninth Edition, for gdb version 6.8.50.20090706
PACKAGE
(GDB)
广告: c/c++学习群(4649839)
本群大部分时间讨论的是八卦、文艺、帝国的事情,偶尔说些叫做技
术的事情,群内多数人对于文艺比较热衷,如果你没有语言洁癖,精
神洁癖,神经比较大条,对于编程又有那么一点热衷和兴趣,乐于分
享和解答你编程中的困惑,疑问,而且不要求别人给你写作业,应付
老师检查,欢迎这样的英雄,尤其是女英雄加入。括弧(群内不乏热
衷于解答女英雄编程,人生,感情的困惑)
另,群成员梭鱼 (2109598) 诚征女友,意者单独与其联系。
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.cn
前言 ..................................................................................................................................................6
第一章:一个 GDB 会话样例 ........................................................................................................6
1 一个 GDB 会话样例 ....................................................................................................6
第二章:进入和离开 GDB...........................................................................................................10
2.1 调用 GDB........................................................................................................................10
2.1.1 选择文件...............................................................................................................11
2.1.2 选择模式...............................................................................................................12
2.1.3 GDB 在启动阶段的活动 ......................................................................................14
2.2 退出 GDB........................................................................................................................15
2.3 Shell 命令 .........................................................................................................................15
2.4 日志输出..........................................................................................................................15
第三章 GDB 命令 ........................................................................................................................16
3.1 命令语法..........................................................................................................................16
3.2 命令补全..........................................................................................................................16
3.3 帮助..................................................................................................................................18
第四章 在 GDB 里运行程序 ........................................................................................................20
4.1 为调试而编译..................................................................................................................20
4.2 开始程序..........................................................................................................................21
4.3 程序参数..........................................................................................................................22
4.4 程序的环境......................................................................................................................23
4.5 程序的工作目录..............................................................................................................24
4.6 程序的输入输出..............................................................................................................24
4.7 调试一个已经在运行的进程..........................................................................................25
4.8 杀死子进程......................................................................................................................25
4.9 调试多线程进程..............................................................................................................26
4.10 调试多个程序................................................................................................................28
4.11 为跳转设置书签............................................................................................................30
4.11.1 使用检查点的隐含好处.....................................................................................31
第五章 中断和继续.....................................................................................................................31
5.1 断点,监视点,捕获点..................................................................................................31
5.1.1 设置断点...............................................................................................................32
5.1.2 设置监视点...........................................................................................................36
5.1.3 设置捕获点...........................................................................................................38
5.1.4 删除断点...............................................................................................................39
5.1.5 禁用断点...............................................................................................................40
5.1.6 中断条件...............................................................................................................41
5.1.7 断点命令列表.......................................................................................................42
5.1.8 断点菜单...............................................................................................................43
5.1.9 “不能插入断点”...............................................................................................44
5.1.10 “断点地址已调整…”.....................................................................................44
5.2 继续和单步跟踪..............................................................................................................45
5.3 信号..................................................................................................................................48
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.cn
5.4 中断和开始多线程程序..................................................................................................49
第六章 检查栈...............................................................................................................................51
6.1 堆栈帧..............................................................................................................................51
6.2 回溯..................................................................................................................................52
6.3 选择堆栈帧......................................................................................................................53
6.4 堆栈帧信息......................................................................................................................54
第七章 检查源文件.......................................................................................................................55
7.1 打印源代码行..................................................................................................................55
7.2 指定位置..........................................................................................................................56
7.3 编辑源文件......................................................................................................................57
7.3.1 选择编辑器...........................................................................................................58
7.4 搜索源文件......................................................................................................................58
7.5 指定源文件目录..............................................................................................................58
7.6 源代码和机器代码..........................................................................................................61
第八章 查看数据...........................................................................................................................62
8.1 表达式..............................................................................................................................62
8.2 程序变量..........................................................................................................................63
8.3 伪数组..............................................................................................................................65
8.4 输出格式..........................................................................................................................65
8.5 查看内存..........................................................................................................................66
8.6 自动显示..........................................................................................................................68
8.7 打印设置..........................................................................................................................69
8.8 值历史..............................................................................................................................74
8.9 惯用变量..........................................................................................................................75
8.10 寄存器............................................................................................................................76
8.11 浮点硬件........................................................................................................................77
8.12 向量单元........................................................................................................................77
8.13 操作系统辅助信息........................................................................................................78
8.14 内存区域属性................................................................................................................78
8.14.1 属性.....................................................................................................................79
8.14.2 内存访问检查.....................................................................................................80
8.15 在内存和文件之间复制数据........................................................................................80
8.16 如何从程序里产生 Core 文件......................................................................................81
8.17 字符集............................................................................................................................81
8.18 缓存远程目标的数据....................................................................................................84
第九章 C 预处理宏.......................................................................................................................84
第十章 跟踪点.............................................................................................................................88
10.1 设置跟踪点的命令........................................................................................................88
10.1.1 创建和删除跟踪点.............................................................................................88
10.1.2 激活和禁用跟踪点.............................................................................................89
10.1.3 跟踪点通过计数.................................................................................................89
10.1.4 跟踪点操作列表.................................................................................................90
10.1.5 跟踪点列表.........................................................................................................91
10.1.6 开始和中止跟踪会话.........................................................................................91
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.cn
10.2 使用已收集的数据........................................................................................................92
10.2.1 tfind n...................................................................................................................92
10.2.2 tdump...................................................................................................................94
10.2.3 save-tracepoints filename.....................................................................................95
第十一章调试 使用覆盖技术的程序...........................................................................................95
11.1 覆盖是如何工作的........................................................................................................96
11.2 覆盖命令......................................................................................................................97
11.3 自动覆盖调试................................................................................................................99
11.4 覆盖示例程序................................................................................................................99
第十二章 用 GDB 调试不同语言编写的程序 ..........................................................................100
12.1 切换源代码语言..........................................................................................................100
12.1.1 文件扩展名和语言列表...................................................................................101
12.1.2 设置工作语言...................................................................................................101
12.1.3 让 GDB 推断源语言 ........................................................................................102
12.2 显示语言......................................................................................................................102
12.3 类型和域检查..............................................................................................................102
12.3.1 类型检查概述...................................................................................................103
12.4 语言支持......................................................................................................................103
12.4.1 C 和 C++............................................................................................................104
12.4.1.1 C 和 C++操作符.............................................................................................104
12.4.1.2 C 和 C++常量.................................................................................................105
12.4.1.3 C++表达式......................................................................................................106
12.4.1.4 C 和 C++缺省值.............................................................................................107
12.4.1.5 C 和 C++类型和域检查.................................................................................107
12.4.1.6 GDB 和 C........................................................................................................107
12.4.1.7 GDB 的 C++功能 ...........................................................................................107
12.4.1.8 十进制浮点格式............................................................................................108
12.4.2 Objective-C........................................................................................................109
12.4.2.1 命令里的方法名............................................................................................109
12.4.2.2 和 Objective-C 协作的 Print 命令.................................................................110
12.4.3 Fortran................................................................................................................110
12.4.3.1 Fortran 操作符和表达式 ................................................................................110
12.4.3.2 Fortran 的缺省值............................................................................................110
12.4.3.3 Fortran 的特殊命令........................................................................................110
12.4.4 Pascal.................................................................................................................111
12.4.5 Modula-2............................................................................................................111
12.4.5.1 操作符............................................................................................................111
12.4.5.2 内建函数和过程............................................................................................112
12.4.5.3 常量................................................................................................................113
12.4.5.4 Modula-2 类型................................................................................................113
12.4.5.5 Modula-2 的缺省设置 ....................................................................................115
12.4.5.6 与标准 Modula-2 的差异..............................................................................116
12.4.5.7 Modula-2 类型和域检查................................................................................116
12.4.5.8 范围操作符::和..............................................................................................116
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.cn
12.4.5.9 GDB 和 Modula-2...........................................................................................117
12.4.6 Ada.....................................................................................................................117
12.4.6.1 介绍................................................................................................................117
12.4.6.2 Ada 里的遗漏 .................................................................................................118
12.4.6.3 对 Ada 的扩展...............................................................................................119
12.4.6.4 在开头处停止................................................................................................120
12.4.6.5..........................................................................................................................120
12.5 未支持的语言..............................................................................................................120
第十三章 查看符号表.................................................................................................................121
第十四章 改变执行.....................................................................................................................125
14.1 给变量赋值..................................................................................................................126
14.2 在不同的位置上继续执行..........................................................................................127
14.3 为程序设置信号..........................................................................................................127
14.4 从函数里返回..............................................................................................................128
14.5 调用程序函数..............................................................................................................128
14.6 为程序打补丁..............................................................................................................129
第十五章 GDB 文件 ...................................................................................................................129
15.1 设置文件的命令..........................................................................................................129
15.2 调试信息位于不同文件中..........................................................................................135
15.3 读取符号文件的错误..................................................................................................138
第十六章 设置调试目标.............................................................................................................139
16.1 有效目标......................................................................................................................140
16.2 管理目标的命令..........................................................................................................140
16.3 选择目标字节序..........................................................................................................142
第十七章调试 远程程序.............................................................................................................143
17.1 连接到远程目标..........................................................................................................143
17.2 给远程系统发送文件..................................................................................................144
17.3 使用 gdbserver 程序....................................................................................................145
17.3.1 运行 gdbserver..................................................................................................145
17.3.1.1 附着到运行着的程序....................................................................................146
17.3.1.2 gdbserver 的多进程模式................................................................................146
17.3.1.3 其它 gdbserver 命令行参数..........................................................................146
17.3.2 连接 gdbserver..................................................................................................147
17.3.3 gdbserver 的监视命令.......................................................................................147
17.4 远程配置......................................................................................................................147
17.5 实现远程代理..............................................................................................................149
17.5.1 代理能为你做什么...........................................................................................150
17.5.2 你必须为代理做什么.......................................................................................151
17.5.3 集成...................................................................................................................152
第十八章 配置相关的信息.........................................................................................................152
18.1 本地..............................................................................................................................153
18.1.1 HP-UX...............................................................................................................153
18.1.2 BSD libkvm 接口...............................................................................................153
18.1.3 SVR4 进程信息..............................................................................................153
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.cn
18.1.4 调试 DJGPP 程序的功能.................................................................................154
前言
翻译:shyboysby.spaces.live.com
本翻译遵从 GPL。参见:
gdb is free software, protected by the gnu General Public License (GPL). The GPL gives
you the freedom to copy or adapt a licensed program—but every person getting a copy also
gets with it the freedom to modify that copy (which means that they must get access to the
source code), and the freedom to distribute further copies. Typical software companies use
copyrights to limit your freedoms; the Free Software Foundation uses the GPL to preserve
these freedoms.
Fundamentally, the General Public License is a license which says that you have these
freedoms and that you cannot take these freedoms away from anyone else.
欢迎转载(请注明出处),但不允许用以商业赢利。本翻译保留相应权利。
自由软件需要自由文档。
自由属于人民。
第一章:一个 GDB 会话样例
1 一个 GDB 会话样例
你可以随意用这部手册来了解有关 GDB 的一切。然而,一些趁手的命令就足以开始使用
调试器。这一章介绍了这些命令。
在这个简单的会话里,我们强调用户输入用黑体来显示,这样可以和环境输出明确的区分
开来。
GNU m4 (通用宏处理器)的以前版本有以下的一个 bug:有时候,在我们改变了宏默认的
引号字符串的时候,用来在别的宏里捕获
宏定义的命令就失效了。在接下来简短的 m4 例子里,我们定义了一个展开是“0000”的宏
foo;我们接着用 m4 内建的 defn 来定义宏 bar,bar 的
值也是“0000”。然而,在我们用来替代开引号字符和用替代闭引号
字符的后,定义一个同义词 baz 的相同的过程却失败了。
baz:
$ cd gnu/m4
$ ./m4
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.cn
define(foo,0000)
foo
0000
define(bar,defn(‘foo’))
bar
0000
changequote(,)
define(baz,defn(foo))
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 6.8.50.20080307, 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(,)
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
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.cn
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 "", 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
我们 step 几行来观察会发生什么。在开始的两次为了避免进入 xstrdup 子程序,我们用's';接
下来的两次我们用'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(print)
(gdb) p lquote
$1 = 0x35d40 ""
(gdb) p rquote
$2 = 0x35d50 ""
lquote 和 rquote 确实是新的左右引号。为了查看一些相关的信息,我们可以用命令 l(list)显
示当前代码附近的 10 行代码。
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.cn