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 breakpointtb 函数名
:同上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