GDB(GNU DeBugger)是GNU的调试器,一般和GCC(GNU Compiler Collection)配搭使用。要使用GDB进行调试,编译程序时要指定-g或-ggdb的编译选项。如:
gcc –g main.c
gcc –ggdb main.c
这样,gcc就会在生成可执行文件时产生调试讯息。-g用于产生一般的调试讯息,-ggdb则用于产生GDB特有的调试讯息。使用-ggdb时,可执行文件的尺寸会大大增加。
下面先说明GDB的基本指令:
f(ile) :指定一个可执行文件进行调试,gdb将读取些文件的调试讯息,如f a.exe
l(ist):列程序出源文件
r(un):装载完要调试的可执行文件后,可以用run命令运行可执行文件
b(reak):设置断点(break point),如b 25,则在源程序的第25行设置一个断点,当程序执行到第25行时,就会产生中断;也可以使用b funcname,funcname为函数的名称,当程序调用些函数时,则产生中断
c(ontinue):c命令可以另中断的程序继续执行,直到下一个中断点或程序结束
p(rint):输入某个变量的值,如程序定义了一个int aa的就是,p aa就会输出aa的当前值
n(ext):程序执行到断点时中断执行,可以用n指令进行单步执行
s(tep):程序执行到断点时中断执行,可以用s指令进行单步执行进某一函数
q(uit):退出GDB
现在让我们来举一个简单的例子来说明GDB的使用,假设我们有以下的程序:
/****************************************************************************
gdb_sample.c
****************************************************************************/
#include <stdio.h>
void PrintLn(const char* pMsg)
{
printf(“%s\n”, pMsg);
}
int main(int argc, char* argv[])
{
PrintLn(“Hello GDB”);
return 0;
}
调行以下命令编译程序gcc –g gdb_sample.c –o a.exe,生成a.exe的可执行文件。要用GDB调试程序,执行:
gdb a.exe
这样,我们就进入了gdb的调试环境。在gdb的命令行中输入list,gdb就会把上面的源程序打印出来,再次输入list,则进行翻页。接着,我们输入b 13,表示在源程序的第13行PrintLn("Hello GDB")设置断点。设置断点后我们开始执行程序,在命令行中输入run,a.exe就开始执行。由于我们在第13行设置了断点,因此,程序会在PrintLn("Hello GDB")处中断,此时,我们可以输入s,gdb会单步运行进PrintLn函数内,接着输入n,程序就会执行此语句:printf("%s\n", pMsg),此时,我们再输入print pMsg,gdb就会输出pMsg的值:“Hello GDB”。最后,我们输入c,程序继续执行,然后正常退出。
linux的程序调试工具GDB的使用手册
--------------------------------------------------------------------------------
GNU工具软件 gdb(1)
工具名称:
gdb — GNU调试器
用法简述:
gdb [-help] [-nx] [-q] [-batch] [-cd=dir] [-f] [-b bps] [-tty=dev]
[-s symfile] [-e prog] [-se prog] [-c core] [-x cmds] [-d dir]
[prog[core|procID]]
工具介绍:
GDB是一种程序调试工具,它可以让你知道一个正在运行中的程序内部发生的事情
,或者崩溃的时候它到底做了什么。
GDB主要可以做四类事情来助你除错:
- 启动程序,显示运行状况。
- 在设置的中断条件下,终止程序运行。
- 检测程序中止时所发生的事情。
- 修改程序文件。
GDB可以用来调试C、C++以及Modua-2写成的程序。对Fortran的支持将在GNU版的
Fortran编译器出现以后加入。
GDB通过shell命令gdb调用。一旦运行,它就从终端读取命令直到quit命令结束程序
。你还可以用help命令获取gdb的在线帮助信息。
运行gdb可以不输入参数和选项;但是更通常的用法是采用一两个参数,同时可执行
文件名作为参数具体给出:
例:gdb program
在给出可执行文件名的同时还可以指定一个相应的core文件:
例:gdb program core
如果想调试一个正在运行中的程序可以经进程ID作为第二个参数给出:
例:gdb program 1234
gdb将处理ID号为1234的进程(除非你还有一个名为1234的文件;GDB将会首先查找一个core
文件)。
以下是一些GDB经常用到的命令:
break [文件名:] 函数名
在文件内的某函数设置断点。
run [参数列表]
如果给定参数列表,那么运行程序的时候带上参数表给出的参数。
bt Backtrace(调试后台跟踪):显示程序堆栈。
print expr(表达式)
显示表达式的结果值。
c 继续运行程序(程序终止以后,比如,在断点处。)
next 接着执行下一程序行;单步跳过行中所有函数。
step 接着执行下一程序行;单步跳入行中所有函数。
help [name]
显示输出关于GDB命令的信息,或者总体的用法说明。
quit 离开GDB。
要得到全面详细的GDB信息,可查阅《Using GDB:A Guide to the GNU
Source-level Debugger 》,作者:Richard M. Stallman和Roland H.Pesch。
info程序提供了gdb的在线使用文档。
选 项:
除了选项所有参数指定了一个程序文件和core文件(或者进程ID);也就是说,
第一个参数如果没有参数其实与一个‘-se’选项等同,同样,第二个参数如果是一
个文件名则等同一个‘-c’选项。许多选项有长短两种格式;这两种在这里都将给出。
只要你的参数够明确,缩减的长格式同样会被识别。(如果愿意可以用‘+’、‘-’来
标记选项参数,尽管我们会阐明更常用的约定。)
所有你给出的选项、命令行参数会依次被读取执行,如果用到‘-x’选项, 那么,
其前后次序不同将会有所不同执行结果。
1. -help
-h
列出所有选项,并附带间断的解释。
2. -symbols=文件名
-s file
从文件中读取符号表。
3. -write
可执行文件和core文件功能开启。
4. -exec=文件名
-e 文件名
如果合适的话将用文件(file)作为一个可执行文件运行,来检测和 core 转储
文件连接的纯数据。
5. -core=文件名
-c 文件名
用指定文件来作为core转储文件来检测。
6. -command=文件名
-x 文件名
执行来自指定文件的GDB命令。
7. -directory=目录名
-d 目录名
在搜索源文件的路径中加入指定目录。
8. -nx
-n
不执行来自任何‘.gdbinit’类初始化文件的命令。通常,这类文件中的命令
会在所有命令选项和参数被执行后才会被运行。
9. -quiet
-q
“Quiet”。禁止显示介绍和版权信息,批处理模式同样禁止。
10. -batch
在批处理模式下运行。在指定-x的条件下,执行完所有命令文件后‘0’状态
退出(若无禁止,还包括‘.gdbninit’类文件。)。在执行命令文件中的gdb
命令时如果发生错误,则以非‘0’状态退出。
批处理模式在将GDB作为筛选器时是很有用的。比如在下载或在另台计算机上
运行一个程序;为了让它起到作用,批处理模式下不会再送出“Program exited
normallly.”信息。而该信息在GDB的控制终端运行程序时通常是要显示的。
11. -cd=目录名
用制定目录名作为运行GDB时的工作目录代替当前目录。
12. -b bps
用来在远程调试程序的状态下设置串口的比特率和波特率。
13. tty=设备名
采用制定的设备作为程序的标准输入、输出。
14. -fullname
-f
Emacs通过设置该选项来运行GDB子进程。它告诉GDB在每次显示堆栈帧( 包括每次
程序运行终止)时以一个可识别的标准形式输出完整的文件名、行号。该可识别格式
看起来是两个‘32’字符跟在用冒号隔开的文件名、行号和字符位置后面。Emacs、
GDB间的接口程序用两个‘32’字符作为显示源代码帧的信号。
参 阅:
info工具中提供的gdb在线文档条目;
Using GDB:A Guide to the GNU Source-level Debugger,Richard M. Stallman
and ROland H. Pesch,1991.7。
重要链接
http://www.jijiao.com.cn/develop/gdb_linuxdev/
评论