熟练使用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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?
立即登录/注册


微信扫码登录