gdb的使用指南(上)

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

1.使用gdb的前提

gccLinux系统、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

nnext的缩略。

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

(gdb) s

sstep的缩略。

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

(gdb) c

ccontinue的缩略。

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

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

pprint的缩略。

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

语法格式含义
o8进制表示
x16进制表示
t2进制表示
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>

其中的<linespec>可以是文件的行号,可以是file:line格式,可以是+num这种偏移量格式。

②跳转并执行指定内存地址的代码

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) delete      → break 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]
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值