gdb调试技巧

之前虽然用过gdb但是具体的还不太特别深入一直使用的都是vs。
现在在服务器上调试代码,gdb调试不可或缺。

cmake -DRELEASE=OFF .. //编译成调试版本
gdb --args ./可执行程序 其他参数

r //运行
b 某个文件:某一行  //设置断点
b 某个函数     //跳转至某个函数 
show listsize  // 查看使用l可以展示多少行
set listsize 30 //将listsize设置为30
show breakpoints  //参看已经设置的断点
clear 某文件:某一行 //清除已经设置的断点
n //逐行运行
s // step into 
q // quit
print // 查看某个变量  //p
ptype //查看某个变量的类型

until 行号 //用于跳出循环
finish //用于跳出函数

查看地址上的值

x /参数 起始地址

这里的参数包括

x 是 examine 的缩写

n表示要显示的内存单元的个数

f表示显示方式, 可取如下值
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
i 指令地址格式
c 按字符格式显示变量。
f 按浮点数格式显示变量。

u表示一个地址单元的长度
b表示单字节,
h表示双字节,
w表示四字节,
g表示八字节 
//比如查看某个图片data的前20字节
x /20ub data_start_address
info locaks //查看局部变量
bt  //查看调用栈
bt full // 会显示参数及局部变量的信息
up/down //在栈帧中切换
frame 栈帧号 // 在栈帧中跳转

断点

b symbol
b file:line
c, continue
info b, info breakpoints
d 断点号
enable/disable 断点号 

有时候需要关注断点的End字段,有时候会应为gdb解析不到符号源文件导致断点自动disable,如果发现断点没有正常工作,需要检查是否被disable

临时断点

tbreak 断点 //一次命中删除
tbreak main

条件断点

通常用于很for循环之类的调试
b location if condition

posted @ 2020-09-27 11:18  cyssmile  阅读(60)  评论(0编辑  收藏  举报