您当前的位置: 首页 > 

phymat.nico

暂无认证

  • 1浏览

    0关注

    1967博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

使用gdb调试程序详解

phymat.nico 发布时间:2017-12-18 00:20:52 ,浏览量:1

熟练使用gdb是一个linux下开发人员必备的一项技能,我们由浅入深的学习一下gdb的强大功能。 一.gdb简单介绍 名称

    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主要可以做4大类事(加上一些其他的辅助工作),以帮助用户在程序运行过程中发现bug。     o  启动您的程序,并列出可能会影响它运行的一些信息     o  使您的程序在特定条件下停止下来     o  当程序停下来的时候,检查发生了什么(简单来说,就是当在打开了core文件限制后,gdb能够调试core文件来定位程序出现问题的地方)     o  对程序做出相应的调整,这样您就能尝试纠正一个错误并继续发现其它错误

二.gdb的启动 一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先 在编译时,我们必须要把调试信息加到可执行文件中。使用编译器( cc/gcc/g++)的 -g 参数可以做到这一点。如:

gcc -g hello.c -o hello  g++ -g hello.cpp-o hello

如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行 时的内存地址。 启动GDB的方法有以下几种:

    1、gdb program也就是你的执行文件,一般在当然目录下。     2、gdb core 用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。     3、gdb 如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时 的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环 境变量中搜索得到。

GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb -help查看。我在下面只例举一些比较常用的参数:

-help (-h)       列出所有选项,并附简要说明。 -symbols=file (-s file)       读出文件(file)中的符号表。 -write       开通(enable)往可执行文件和核心文件写的权限。 -exec=file (-e file)       在适当时候把File作为可执行的文件执行,来检测与core dump结合的数据。 -se File       从File读取符号表并把它作为可执行文件。 -core File (-c File)       把File作为core dump来执行。 -directory=Directory (-d Directory)       把Dicrctory加入源文件搜索的路径中。 -cd=Directory       运行GDB,使用Directory作为它的工作目录,取代当前工作目录.

三.gdb的命令字介绍 我们简要介绍一下在gdb调试中需要用到的命令字

file [filename]       装入想要调试的可执行文件 kill [filename]       终止正在调试的程序 break [file:]function       在(file文件的)function函数中设置一个断点 clear       删除一个断点,这个命令需要指定代码行或者函数名作为参数 run [arglist]       运行您的程序 (如果指定了arglist,则将arglist作为参数运行程序) bt Backtrace       显示程序堆栈信息 print expr       打印表达式的值 continue       继续运行您的程序 (在停止之后,比如在一个断点之后) list       列出产生执行文件的源代码的一部分 next       单步执行 (在停止之后); 跳过函数调用(与step相对应,step会进入函数内部) nexti       执行下一行的源代码中的一条汇编指令 set       设置变量的值。例如:set nval=54 将把54保存到nval变量中;设置输入参数也可以通过这个命令(例如当三个入参分别为a、b、c的话,set args a b c) step       单步执行 (在停止之后); 进入函数调用 stepi       继续执行程序下一行源代码中的汇编指令。如果是函数调用,这个命令将进入函数的内部,单步执行函数中的汇编代码 watch       使你能监视一个变量的值而不管它何时被改变 rwatch       指定一个变量,如果这个变量被读,则暂停程序运行,在调试器中显示信息,并等待下一个调试命令。参考rwatch和watch命令 awatch       指定一个变量,如果这个变量被读或者被写,则暂停程序运行,在调试器中显示信息,并等待下一个调试命令。参考rwatch和watch命令 Ctrl-C       在当前位置停止执行正在执行的程序,断点在当前行 disable       禁止断点功能,这个命令需要禁止的断点在断点列表索引值作为参数 display       在断点的停止的地方,显示指定的表达式的值。(显示变量) undisplay       删除一个display设置的变量显示。这个命令需要将display list中的索引做参数 enable       允许断点功能,这个命令需要允许的断点在断点列表索引值作为参数 finish       继续执行,直到当前函数返回 ignore       忽略某个断点制定的次数。例:ignore 4 23 忽略断点4的23次运行,在第24次的时候中断 info [name]       查看name信息 load       动态载入一个可执行文件到调试器 xbreak       在当前函数的退出的点上设置一个断点 whatis       显示变量的值和类型 ptype       显示变量的类型 return       强制从当前函数返回 txbreak       在当前函数的退出的点上设置一个临时的断点(只可使用一次) make       使你能不退出 gdb 就可以重新产生可执行文件 shell       使你能不离开 gdb 就执行 UNIX shell 命令 help [name]       显示GDB命令的信息,或者显示如何使用GDB的总体信息 quit       退出gdb.

四.gdb调试程序实例

源程序:tst.c

#include int func(int n) {     int sum=0,i;     for(i=0; i
关注
打赏
1659628745
查看更多评论
立即登录/注册

微信扫码登录

0.0558s