type
status
date
slug
summary
tags
icon
password
GDB的一些调试小技巧
1、 next
next命令(简写为n),是让GDB完整的执行当前行(包含行里的函数调用)然后调到下一个命令去(在这里的下一行命令指的是逻辑上的下一行,而不是有关于位置上的下一行)
2、 step
step命令(简写为s),是进行单步调用,遇到函数的调用的话就进入当函数内部。完整的,一步步的进行步骤。
3、 finish
在某个函数里面调试一段时间之后,不再需要一步步执行到函数返回处,希望直接执行完当前函数并且返回到上一层调用处。可以使用finish命令。(finish命令是会执行剩下的代码,然后返回到上一层)
4、 return
命令是立即结束执行当前函数并返回,也就是说,如果当前函数还有剩余的代码未执行完毕,也不会执行了(最后可能会导致未执行的地方没有处理导致最后得到的结果错误)。
例子:finish-return_test.c

5、 jump
形式为:jump <location>
location 可以是程序的行号或者函数的地址,jump 会让程序执行流跳转到指定位置执行,当然其行为也是不可控制的,例如您跳过了某个对象的初始化代码,直接执行操作该对象的代码,那么可能会导致程序崩溃或其他意外行为。jump 命令可以简写成 j,但是不可以简写成 jmp,其使用有一个注意事项,即如果 jump 跳转到的位置后续没有断点,那么 GDB 会执行完跳转处的代码会继续执行。
jump命令除了跳过一些正常代码的执行以外,还有一个好用的方式就是可以执行一些我们想执行的代码。比如说,判断语句if…else…的判断下只执行了if而没有执行else,如果我们想要执行else的话,就可以使用jump指令,跳转到任意想执行的地方。
例:jump_test.c
6、 查看变量
① 值
查看变量值有两种方式:
第一种是根据地址来查看变量,这个时候用到的指令是x
格式:x 地址 作用:查看指定地址的内存
格式:x </n/f/u> 地址 作用:以指定形式输出内存内容
n:是正整数,表示需要显示的内存单元的个数,即从当前地址向后显示n个内存单元的内容,
一个内存单元的大小由第三个参数u定义。
f:表示addr指向的内存内容的输出格式,s对应输出字符串,此处需特别注意输出整型数据的格式:
x 按十六进制格式显示变量.
d 按十进制格式显示变量。
u 按十进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。
u:就是指以多少个字节作为一个内存单元-unit,默认为4。u还可以用被一些字符表示:
如b=1 byte, h=2 bytes,w=4 bytes,g=8 bytes.
第二种是根据变量名来显示,这个时候用的指令是p
格式:p 变量名 作用:查看变量
② 类型
所谓类型就是看这个变量属于什么类型
格式:ptype 变量 查看变量
7、 frame
简写为f,切换到当前调用线程指定堆栈,具体堆栈通过堆栈序号指定
格式:frame 堆栈序号
- 作者:JucanaYu
- 链接:https://jucanayu.top/article/d9ab72f1-653c-4dc2-b5d9-872b78d0b5b6
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。