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/

评论