标题：gdb
功能
一般来说，GDB主要帮助你完成下面四个方面的功能：
1、启动你的程序，可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。（断点可以是条件表达式）
3、当程序被停住时，可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。
《GDB使用手册》
版本发布
2009年12月29日，程序调试工具 GDB 7.0.1 发布，新版本修正了 7.0 版本的一些严重的堆栈溢出bug，这些bug可能导致 GDB 调试进程中断，修正了在 FreeBSD 和 IRⅨ 系统下无法编译的问题，增加了对 Thumb2调试的支持，还有其他一些小bug的修复。
2010年03月19日，GDB 7.1 发布，
详细改进内容：多程序调试的支持；
位置独立的可执行文件（派）调试的支持；
新的目标（包括一个模拟器）：Xilinx MicroBlaze和瑞萨RX;
Python支持增强；
c++支持扩展；
新tracepoint功能；
过程记录的改进;
远程协议扩展。
2010年09月06日 ，GDB 7.2 发布，
该版本改进记录：
⒈ 支持 D语言
⒉ C++ 改进，支持参数依赖查找ADL，静态常量类成员和改进了用户自定义操作符的支持
⒊ Python 调试的改进，包括断点、符号、符号表、程序空间、线程等可通过命令行进行操作
⒋ Furthermore,enhancements were made for tracepoints and for GDBserver. 
⒌ 支持 ARM Symbian 平台
⒍ 其他方面的改进和bug修复。
2011年08月26日，GDB 7.3a 发布，
变化：
1。GDB现在理解线程的名字。
2。这个命令”线程名称”（指定一个名称）和“线程找到[REGEXP]”（匹配名称、目标ID,或者额外的信息）被添加。
3。Python脚本支持是大大增强。
4。在c++的支持，异常处理是提高，和模板参数现在放在范围在一个实例化时调试。
5。线程调试的核心转储在GNU / Linux现在是可能的。
6。最初支持OpenCL介绍了C语言。
7。许多其他增强了。
文件清单
List 
（gdb) list line1,line2
查看源代码
list lineNum 在lineNum的前后源代码显示出来
list + 列出当前行的后面代码行
list - 列出当前行的前面代码行
list function
set listsize count 
设置显示代码的行数
show listsize
显示打印代码的行数
list first,last
显示从first到last的源代码行
执行程序
要想运行准备调试的程序，可使用run命令，在它后面可以跟随发给该程序的任何参数，包括标准输入和标准输出说明符（<；和>；）和shell通配符（*、？、[、]）在内。如果你使用不带参数的run命令，gdb就再次使用你给予前一条run命令的参数，这是很有用的。利用set args 命令就可以修改发送给程序的参数，而使用show args 命令就可以查看其缺省参数的列表。
（gdb）set args –b –x
（gdb) show args
backtrace命令为堆栈提供向后跟踪功能。
Backtrace 命令产生一张列表，包含着从最近的过程开始的所有有效过程和调用这些过程的参数。
显示数据
利用print 命令可以检查各个变量的值。
（gdb) print p (p为变量名）
print 是gdb的一个功能很强的命令，利用它可以显示被调试的语言中任何有效的表达式。表达式除了包含你程序中的变量外，还可以包含以下内容：
对程序中函数的调用 
（gdb) print find_entry（1,0)
数据结构和其他复杂对象 
（gdb) print *table_start
={e=reference=’\000’，location=0x0,next=0x0}
值的历史成分 
（gdb)print （为历史记录变量，在以后可以直接引用的值）
人为数组
人为数组提供了一种去显示存储器块（数组节或动态分配的存储区）内容的方法。早期的调试程序没有很好的方法将任意的指针换成一个数组。就像对待参数一样，让我们查看内存中在变量h后面的10个整数，一个动态数组的语法如下所示：
base@length
因此，要想显示在h后面的10个元素，可以使用h@10：
（gdb)print h@10
=(-1,345,23,-234,0,0,0,98,345,10）
whatis 命令可以显示某个变量的类型 
（gdb) whatis p
type = int *
断点
break命令（可以简写为b）可以用来在调试的程序中设置断点，该命令有如下四种形式：
break line-number 使程序恰好在执行给定行之前停止。
break function-name 使程序恰好在进入指定的函数之前停止。
break line-or-function if condition 如果condition（条件）是真，程序到达指定行或函数时停止。
break routine-name 在指定例程的入口处设置断点
如果该程序是由很多原文件构成的，你可以在各个原文件中设置断点，而不是在当前的原文件中设置断点，其方法如下：
（gdb) break filename:line-number
（gdb) break filename:function-name
要想设置一个条件断点，可以利用break if命令，如下所示：
（gdb) break line-or-function if expr
例：
（gdb) break 46 if testsize==100
从断点继续运行：continue 命令
断点管理
1．显示当前gdb的断点信息：
（gdb) info break
他会以如下的形式显示所有的断点信息：
Num Type Disp Enb Address What
1 breakpoint keep y 0x000028bc in init_random at qsort2.c:155
2 breakpoint keep y 0x0000291c in init_organ at qsort2.c:168
删除指定的某个断点：
（gdb) delete breakpoint 1
该命令将会删除编号为1的断点，如果不带编号参数，将删除所有的断点 
（gdb) delete breakpoint
禁止使用某个断点
（gdb) disable breakpoint 1
该命令将禁止断点 1，同时断点信息的 (Enb）域将变为 n 
允许使用某个断点
（gdb) enable breakpoint 1
该命令将允许断点 1，同时断点信息的 (Enb）域将变为 y 
清除原文件中某一代码行上的所有断点
（gdb)clear number
注：number 为原文件的某个代码行的行号
变量检查赋值
whatis：识别数组或变量的类型 
ptype：比whatis的功能更强，他可以提供一个结构的定义 
set variable = value：将值赋予变量 
print variable = value or p variable = value : 除了显示一个变量的值外，还可以用来赋值
单步执行
next 不进入的单步执行 
step 进入的单步执行如果已经进入了某函数，而想退出该函数返回到它的调用函数中，可使用命令finish
函数调用
call name 调用和执行一个函数 
（gdb) call gen_and_sork（1234,1,0)
（gdb) call printf（“abcd”）
=4
finish 结束执行当前函数，显示其返回值（如果有的话）
机器语言工具
有一组专用的gdb变量可以用来检查和修改计算机的通用寄存器，gdb提供了目前每一台计算机中实际使用的4个寄存器的标准名字：
$pc ：程序计数器 
$fp ：帧指针（当前堆栈帧） 
$sp ：栈指针 
$ps ：处理器状态
信号
gdb通常可以捕捉到发送给它的大多数信号，通过捕捉信号，它就可决定对于正在运行的进程要做些什么工作。例如，按CTRL-C将中断信号发送给gdb，通常就会终止gdb。但是你或许不想中断gdb，真正的目的是要中断gdb正在运行的程序，因此，gdb要抓住该信号并停止它正在运行的程序，这样就可以执行某些调试操作。
Handle命令可控制信号的处理，他有两个参数，一个是信号名，另一个是接受到信号时该作什么。几种可能的参数是：
nostop 接收到信号时，不要将它发送给程序，也不要停止程序。
stop 接受到信号时停止程序的执行，从而允许程序调试；显示一条表示已接受到信号的消息（禁止使用消息除外） 
print 接受到信号时显示一条消息 
noprint 接受到信号时不要显示消息（而且隐含着不停止程序运行） 
pass 将信号发送给程序，从而允许你的程序去处理它、停止运行或采取别的动作。
nopass 停止程序运行，但不要将信号发送给程序。
例如，假定你截获SIGPIPE信号，以防止正在调试的程序接受到该信号，而且只要该信号一到达，就要求该程序停止，并通知你。要完成这一任务，可利用如下命令：
（gdb) handle SIGPIPE stop print
请注意，UNⅨ的信号名总是采用大写字母！你可以用信号编号替代信号名如果你的程序要执行任何信号处理操作，就需要能够测试其信号处理程序，为此，就需要一种能将信号发送给程序的简便方法，这就是signal命令的任务。该命令的参数是一个数字或者一个名字，如SIGINT。假定你的程序已将一个专用的SIGINT（键盘输入，或CTRL-C；信号2）信号处理程序设置成采取某个清理动作，要想测试该信号处理程序，你可以设置一个断点并使用如下命令：
（gdb） signal 2
continuing with signal SIGINT⑵
该程序继续执行，但是立即传输该信号，而且处理程序开始运行。
GDB使用
GDB是一个强大的命令行调试工具。大家知道命令行的强大就是在于，其可以形成
执行序列，形成脚本。UNⅨ下的软件全是命令行的，这给程序开发提代供了极大的
便利，命令行软件的优势在于，它们可以非常容易的集成在一起，使用几个简单的已
有工具的命令，就可以做出一个非常强大的功能。
于是UNⅨ下的软件比Windows下的软件更能有机地结合，各自发挥各自的长处，组合
成更为强劲的功能。而Windows下的图形软件基本上是各自为营，互相不能调用，很
不利于各种软件的相互集成。在这里并不是要和Windows做个什么比较，所谓“寸有
所长，尺有所短”，图形化工具还是有不如命令行的地方。
GDB调试
一个调试示例
——————
源程序：tst.c
1 #include <stdio.h>
2
3 int func(int n)
4 {
5 int sum=0,i;
6 for(i=0; i<=n; i++)
7 {
8 sum+=i;
9 }
10 return sum;
11 }
12
13
14 main()
15 {
16 int i;
17 long result = 0;
18 for(i=1; i<=100; i++)
19 {
20 result += i;
21 }
22
23 printf("result[1-100] = %d \n",result);
24 printf("result[1-250] = %d \n",func（250））；
25 }
编译生成执行文件：（Linux下）
hchen/test> gcc -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 <stdio.h>
2
3 int func(int n)
4 {
5 int sum=0,i;
6 for(i=0; i<=n; i++)
7 {
8 sum+=i;
9 }
10 return sum;
（gdb) <-------------------- 直接回车表示，重复上一次命令
11 }
12
13
14 main()
15 {
16 int i;
17 long result = 0;
18 for(i=1; i<=100; i++)
19 {
20 result += i;
（gdb) break 16 <-------------------- 设置断点，在源程序第16行处。
Breakpoint 1 at 0x8048496: file tst.c,line 16.
（gdb) break func <-------------------- 设置断点，在函数func（）入口处。
Breakpoint 2 at 0x8048456: file tst.c,line 5.
（gdb) info break <-------------------- 查看断点信息。
Num Type Disp Enb Address What
1 breakpoint keep y 0x08048496 in main at tst.c:16
2 breakpoint keep y 0x08048456 in func at tst.c:5
（gdb) r <--------------------- 运行程序，run命令简写
Starting program: /home/hchen/test/tst
Breakpoint 1,main () at tst.c:17 <---------- 在断点处停住。
17 long result = 0;
（gdb) n <--------------------- 单条语句执行，next命令简写。
18 for(i=1; i<=100; i++)
（gdb) n
20 result += i;
（gdb) n
18 for(i=1; i<=100; i++)
（gdb) n
20 result += i;
（gdb) c <--------------------- 继续运行程序，continue命令简写。
Continuing.
result[1-100] = 5050 <----------程序输出。
Breakpoint 2,func (n=250） at tst.c:5
5 int sum=0,i;
（gdb) n
6 for(i=1; i<=n; i++)
（gdb) p i <--------------------- 打印变量i的值，print命令简写。
= 134513808
（gdb) n
8 sum+=i;
（gdb) n
6 for(i=1; i<=n; i++)
（gdb) p sum
= 1
（gdb) n
8 sum+=i;
（gdb) p i
= 2
（gdb) n
6 for(i=1; i<=n; i++)
（gdb) p sum
= 3
（gdb) bt <--------------------- 查看函数堆栈。
#0 func (n=250） at tst.c:5
#1 0x080484e4 in main () at tst.c:24
#2 0x400409ed in __libc_start_main () from /lib
（gdb) finish <--------------------- 退出函数。
Run till exit from #0 func (n=250） at tst.c:5
0x080484e4 in main () at tst.c:24
24 printf("result[1-250] = %d \n",func（250））；
Value returned is = 31375
（gdb) c <--------------------- 继续运行。
Continuing.
result[1-250] = 31375 <----------程序输出。
Program exited with code 027. <--------程序退出，调试结束。
（gdb) q <--------------------- 退出gdb。
hchen/test>
…………
GDB
广东发展银行英文GUANGDONG DEVELOPMENT BANK 的缩写　
GDB
基因组数据库（genome database）