文章目录
1、gdb 和 cgdb 的区别
相同点:都是调试器,命令基本都通用
gdb:就是一个调试器,启动调试:gdb + 可执行文件
cgdb:是gdb的一个扩展,打开后自动显示源码TUI,方便阅读源码
gdb虽然也可以,但是会经常花屏,需要自己手动刷新界面
缺点:使用print命令的时,无法显示中文字符,可能是乱码或不显示
gdb打开图形界面:开始调试后按ctrl + x +a
gdb -tui + 可执行文件
2、常用的命令
(1)程序运行顺序:
run命令:开始调试
简写命令 r
continue命令:在断点处继续调试,或者按了ctrl c 后继续调试
简写命令 c
next命令:运行到下一行(但是不进入调用的函数) 简写 n
step命令:进入被调用的函数内部 简写 s
util命令:util+ fileline 快速执行到文件某一行 简写 u
jump命令:jump + fileline 跳过中间的代码直接到fileline这一行
finish命令:运行完当前被调用的函数
return 命令:在当前行直接return回去
(2)断点堆栈类命令:
break命令:打断点,例如 break file:line | break 函数名
简写命令 b
backtrace命令:打印堆栈信息
简写命令 bt
frame命令:frame + 堆栈编号(通过bt知道的编号)
作用:跳转到堆栈编号处
简写命令 f
info break命令:查看断点信息
简写命令 i b
enable命令、disable命令、delete命令:打开、关闭、删除断点
通过 i b 命令得到断点编号,这三条命令后接断点编号
delete 删除全部断点:$ delete #这样既可
(3)显示代码或数据类命令
list命令:可以连续按,有 l - 和 l + 两种显示源码顺序
简写命令 l
print命令:打印某个对象的数据,注意指针
简写 p
ptype命令:打印数据类型
watch 命令:观察某一个变量,一旦改变就会打印出来(注意指针)
display 命令:监视变量或内存,每次中断自动打印相应的数据
info args命令:打印参数信息
help info命令:可以看到其他查找info的命令
显示string类型的数据 :(char*)p # p为string类型的指针
set print pretty on #使得结构体数据显示友好一点
(4)线程类命令:
info thread命令:打印线程信息命令
thread + 线程编号 命令:切换线程编号
(5)不常用但重要的命令
disassemble 命令:反汇编(默认AT&T 格式的指令)
set disassembly-flavor intel(设置为intel汇编格式)
set args 和 show args 命令:设置参数、显示参数
tbreak 命令:临时断点,只会运行一次后自动删除
(6)特殊操作
print命令:不仅可以打印数据,还能改变数据
p testInt = 512 #这样就能够改变数据,插入到程序中运行
list命令:可以显示别的文件的信息
list filename:fileline
5、attach 正在运行的进程
ps 得到我们所需要的进程pid
gdb attach pid 开始调试
detach 结束调试
还可以调试core文件,即调试崩溃的程序,这个还没有遇到过,以后再补充