正文

GDB使用帮助2005-12-25 16:09:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/ddtme/8810.html

分享到:

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/
 

阅读(6557) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册