0
点赞
收藏
分享

微信扫一扫

GDB学习

追风骚年 2022-04-18 阅读 54
c++

gdb的使用教程

在gdb下使用shell命令的方法

shell shell-command
pipe p var command| wc管道用法

进入gdb

  • 调试可执行文件
    gcc 编译的时候最好带上-g指令,这样调试器能获得很多信息,gdb a.out即可进入gdb界面
  • 调试进程
    gdb调试运行着的进程 gdb program process-id ,gdb -p process-id均可
    detach attach是可用来调试进程

给调试程序设置命令行参数

set args str str给程序设定参数
show args显示参数

修改程序用到的环境变量

set enviroment varname=val
show enviroment varname

修改程序的执行路径

  • 内部程序工作目录
    set cwd=path
    show cwd
    没设的话默认继承gdb的执行路径
  • gdb工作目录
    cd pwd是可用命令

快照回退

保存某个程序状态,方便回退到这个状态而不用再次启动程序

  • 保存快照 checkpoint

  • 显示所有快照 info checkpoints

  • 删除快照 delete checkpoint id

  • 快照回退 restart id一般而言是形如restart 3这样的,取process前面的数字哟
    在这里插入图片描述

    显示源代码

  • layout src显示c代码

  • layout asm显示程序的反汇编代码

  • 在这里插入图片描述

启动命令

start:跑到main函数
starti:跑到程序第一条指令
run or r: 直接跑到遇到断点为止
continue or c:从断点开始,直到下一个断点暂停
n:下一行代码
ni:下一条指令
c [ignore_count]执行并忽略几次断点
step走源代码的一行,它和next的区别在于next不进入调用函数
finishfin,完成一个函数
until line走到某一行才停
advance line走到某一行才停,不要求在同一个栈帧里
si,ni走过一条指令,区别在于ni不进入函数

打断点

断点类型

  • 条件断点
    例如b 10 if val==3,如果变量val==3才会暂停,要在line 10处,val必须存在。-force-condition 可要求val只在有的时候是有意义的,有的时候找不到这玩意
  • 临时断点(temp break), tbreak args只会暂停一次
  • 正则断点,顾名思议,用正则表达式匹配停止的函数rbreak regex

显示断点信息

info b,info break,info b 1,显示第1个断点信息

  • 编号
  • 类型,breakpoints,watchpoints,catchpoints
  • disposition ,keep保持,delete删除,
  • enb(enable),y能用,n不生效
  • address 地址,为断点在的内存位置,当不知道内存位置时,显示pending
  • what 告诉我们这断点在哪个文件的哪一行,如暂不知,显示名字
    下图中的test是瞎编的,永远找不到这个函数在哪
    在这里插入图片描述
  • 在c文件指定地方打断点
    layout src,b location,location指的是c代码的行数
    b +offsetb -offset相对当前伴置偏移几行打断点
    b filename:linenumber当有多个文件时,需在前面说明文件名
    b默认为当前位置的下一条指令

观测型断点

主要是监测一个值是否发生了变化(写入,读取,值改变),如果发生了变化,停在使它变化的地方,一般使用ide所用到的断点都是上面那种断点,在某个地方打一个断点排错,基本上也够用了,不过了解这种断点会在少数情况下带来方便,比如不知道哪个人的代码改了你的全局变量的时候,或者数据被覆盖的时候。
值改变检测

  • 观测局部变量watch localval,要求当该局部变量的函数被进入时,对全局变量则没有限制
  • 观测表达式,可由局部变量,全局变量组成,当表达式有变化时,停住watch expr.例 watch c*3.

读入检测

  • rwatch args
    读写检测
  • awatch args
    当读或写时都会触发,写时值不改变也会触发

删除断点

clear删除当前断点
clear location删除某一特定断点
delete id删除info b里num=id的断点

指定断点状态

enable/diable [breakpoints] [type] [id...]
disable breakpoints禁用所有断点
enabel breakpoints id1 id2 id3...breakpoints可以不写,使能断点
disable id1 id2 id3禁用某些断点
type:

  • once 只停一次并禁用
  • count cnt 只用cnt次并禁用
  • delete 用一次就删

可编程断点

b 7 if c==3,回车
commands

silent
p c
end

定点输出

dprintf location,template,expression[,expression...]
dprintf 3,"%d %d %d",a,c,b
可以指定printf函数

断点保存

save breakpoints file存储断点
source file使用文件中的断点

举报

相关推荐

0 条评论