GDB笔记
分享一下我使用gdb时经常使用的命令,希望能给到您帮助~
编译生成执行文件:
g++ main.cpp -o main -g
编译时要加上
-g
选项表示debug模式
使用GDB调式:
gdb main
-
运行
:
run
|
r
: 运行程序,当遇到断点的时候,程序会在断点处停止运行,等待用户输入下一步的命令。用法:一般是打完断点后,执行
run
,或简写
r
start
:运行,从第一条语句开始
continue
|
c
:继续执行,直到下一个断点处(或运行结束)。
step
|
s
:执行下一句,如果下一执行语句为函数,进入函数
next
|
n
|
换行
:执行下一句,不进入函数
finish
:从内部函数执行完并返回外部函数。
finish
和
step
操作是相对的 -
打断点
break 行号
|
b 行号
:对当前正在执行的文件的指定行号位置设置断点。
break 文件名:行号
|
b 文件名:行号
:对指定文件的指定行号位置设置断点。
break 函数名
|
b 函数名
:对当前正在执行的文件的指定函数位置设置断点。
break 文件名:函数名
|
b 文件名:函数名
:对指定文件的指定函数位置设置断点
tb 行号
:一次性断点,temporary breakpoint
tb 函数名
:同上
info breakpoint
|
i b
:查看已设置的断点
enable 断点号
:使断点生效
disable 断点号
:使断点失效
delete 断点号
:删除断点还可以搭配 if 语句
b 行号 if 条件表达式
:if条件满足时,停在该行下面展示具体的条件表达式,不过不同的是给函数打断点:
b 函数名 if name == 0
:if 条件满足时,才停在函数名这行上
保存断点信息
:
如果花了很多时间打了一堆有用的断点信息,避免退出gdb后重复打断点,可以使用下面的命令,来保存断点信息,下次进入gdb直接导入上次设置的断点记录即可:
save breakpointes 文件名.gdb
:保存断点信息。
进入gdb后,
source 文件名.gdb
,加载断点信息。 -
查看值
display
变量:显示变量,会在窗口一直显示变量取消用
undisplay display编号
用
i display
可以查看
display
编号
watch变量
:监视修改的变量,可以搭配条件 watch 变量 if条件表达式
rwatch变量
:读取该变量的时候,终止一下。
print 变量
|
p 变量
:打印变量,一次性显示。 -
layout src
:使用窗口查看源代码 -
tui enable
:和上面一样的功能
(建
议
只
记
这
个
,
这
也
是
我
经
常
用
到
的
命
令
)
(建议只记这个,这也是我经常用到的命令)
(
建
议
只
记
这
个
,
这
也
是
我
经
常
用
到
的
命
令
)
-
layout asm
:使用窗口查看汇编源码
其他技巧
一、 查看智能指针指向的数组所有元素:
-
普通指针的情况:
int* p = new int[10];
在gdb中,可以通过
display *p@10
,查看指针p指向的数组首地址连续的10个存储单元的值。 -
那么智能指针如何处理呢?
其实智能指针中存在get()成员函数,它可以返回原始指针,所以可以利用这个函数,假设p为智能指针变量,在gdb中可以如下进行打印:
display *((p.get())@10
二、gdb 查看二维数组
比如,要查看
arr[3][4]
中的全部元素:
display *arr[0]@4 //@4表示4个列元素
display *arr[1]@4
display *arr[2]@4