gdb的使用指南(上)

来源:互联网 发布:一键手绘图的软件 编辑:程序博客网 时间:2024/06/06 01:38

gdb的使用指南(上)

本文将介绍gdb的最基本的使用方法,其中的难点——多线程调试、堆栈信息分析和core文件分析将放在下一节来讲述。

 

1.使用gdb的前提

gcc是Linux系统、Windows系统的cygwin下最常使用的C语言编译器。

$ gcc -g 源代码文件名

如果追加了“-g”编译选项,会在最后生成的可执行文件中嵌入一些用于捕捉和输出程序当前程序运行状态的代码,它们可以帮助我们更好地调试程序,但同时也增加了文件大小、降低运行效率。

 

2.启动gdb环境

$ gdb 可执行文件名

注意:这样只是指定了要调试的对象文件并启动了gdb环境而已,而并没有真正地开始运行程序。

 

3.开始运行程序

(gdb) r

r就是run的省略。通过上面的命令,我们可以开始运行在启动gdb环境时指定了的程序。如果想要传输启动参数,直接在r后面加上参数1, 参数2, 参数3,……即可。

 

4.退出gdb环境

(gdb) q

q就是quit的缩略。

 

5.设置断点

当程序运行到断点时,会自动停止,此时可以输出当前程序的相关信息,帮助我们更好地调试程序。

(gdb) b 行号(gdb) b 函数名(gdb) b 文件名:行号

b就是break的缩略。

 

6.顺序执行

①单步执行,如果当前是一个函数调用语句,则直接执行下一条语句(不进入函数内部)。

(gdb) n

n是next的缩略。

②单步执行,如果当前是一个函数调用语句,则进入该函数内部。

(gdb) s

s是step的缩略。

③继续运行程序,会在遇到断点后再次暂停运行。如果没有遇到断点,就会一直运行到结束。

(gdb) c

c是continue的缩略。

 

7.输出当前某个变量的值

(gdb) p 变量名(gdb) p *指针名(gdb) p &内存地址

p是print的缩略。

print命令可以在后面附加/format选项,用于指定输出的格式。

语法格式 含义 o 8进制表示 x 16进制表示 t 2进制表示 f 浮点数表示 d 有符号10进制表示 u 无符号10进制表示 c 字符 a 内存地址

比如说,我们想以二进制形式打印变量var当前的值,可以这么做:

(gdb) p/t var

 

8.查看更详细的信息

①查看某个变量的类型

whatis 变量名或者ptype 变量名

②查看当前设定的所有断点的信息

info b

③查看当前函数调用的堆栈信息

info stack

④查看当前的线程信息

info Thread

⑤查看当前设定的所有观察点的信息

info watchpoints

关于观察点的概念及其使用,可以查看第11点的内容。
⑥显示所有当前调用栈的所有变量

(gdb) info locals

 

9.跳转

①跳转到指定行,再执行

jump <linespec>

其中的\

jump *内存地址

注意,jump命令不会改变当前的程序栈中的内容。

 

10.设置条件断点

下面的程序对file.cpp文件的function函数设置了一个断点(gdb会自动分配它一个断点编号=1),而且我们规定只有变量x的值为1时才执行中断。

(gdb) break file.cpp:function(gdb) condition 1 x==1(gdb) run

如果我们想消除断点的条件,可以这么做:

(gdb) condition 1

上面的1是指定断点编号为1的断点。

 

11.设置观察点

如果我们想实现下面这样的功能:“当变量i不等于0时执行中断”,就需要用到观察点这个功能了。

1.watch exp:当表达式exp的值有变化时,马上停住程序;

2.rwatch v:当变量v的值被读时,马上停住程序;

3.awatch v:当变量v的值被读或被写时,马上停住程序。

所以,对于“当变量i不等于0时执行中断”这样的需求,我们可以这么做:

(gdb) break file.cpp:function(gdb) run(gdb) deletebreak pointをすべて削除(gdb) watch i==0  → i==0 以外の時にストップ(gdb) c

 

12.改变某个变量的值

(gdb) set var 变量名 = 值

甚至我们可以利用它来指定运行时参数。

(gdb) set args 10 20 30 40 50

上面的命令没有var关键字,是因为args并不是程序本身声明的变量。

虽然在某些情况下,设置程序本身的变量的值可以省去var关键字,但是为了保险起见还是建议不要省略var。

熟悉汇编的人都知道,程序运行时,有一个叫pc的寄存器用于保存当前代码所在的内存地址。于是,你可以使用“set $pc”来更改跳转执行的地址。如:

set $pc = 0x485

 

13.声明辅助变量

$pc这样带$号的变量一般就是gdb为了调试方便自己引入的变量,当然我们也可以定义自己的辅助变量。

(gdb) set $ymm="yang"    #定义辅助变量ymm(gdb) whatis $ymm    #查看变量类型type = char [5]
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 照相机不能拍照了怎么办 红色衣服不红怎么办 拍摄画面过暗怎么办 手机照相机镜头脏了怎么办 单反相机对不了焦怎么办 单反相机聚不了焦怎么办 单反相机对不上焦怎么办 手机拍不了照怎么办 摄影师老了以后怎么办 淘宝卖窗帘配件怎么办 唯品会包裹丢了怎么办 左右脸咬肌不一样大怎么办 脸两边不一样大怎么办 淘宝买的出问题怎么办 淘宝店铺忘记了怎么办 买宠物被骗了怎么办 养羊刚进的羊苗怎么办 孕后期便秘出血怎么办 针织裙子变形了怎么办 背带牛仔裙太短怎么办 牛仔裙太短了怎么办 牛仔裤裤腿瘦了怎么办 牛仔裤买肥了怎么办 牛仔短裤裤腰肥怎么办 白色洞洞鞋脏了怎么办 菜刀快递不让寄怎么办 淘宝退款后悔了怎么办 淘宝退货还收货怎么办 淘宝售后没人理怎么办 淘宝店铺不理人怎么办 客服半天不理人怎么办 淘宝优惠券删了怎么办 ip地址受限制怎么办 订单地址错了怎么办 闲鱼恶意退货怎么办 闲鱼上遇到恶意退货怎么办 快递没修改地址怎么办 买家退货寄错怎么办 收件人想改地址怎么办 淘宝不给你验收怎么办 王者订单不验收怎么办