GDB

本文介绍GDB调试器的基础使用方法,包括启动方式、常用命令及其与VC++调试命令的对比。涵盖断点设置、单步执行、查看内存及变量值等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

一、启动GDB的方式

gdb <program> 

eg:gdb bomb

lprogram也就是你的执行文件,一般在当前目录下

gdb <program> core

lgdb同时调试一个运行程序和core文件,core是程序非法执行后coredump后产生的文件

gdb <program> <PID>

l如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程IDgdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。  

 

二、GDB与VC++调试命令的对比

 

三、GDB常用命令

llist命令来打印程序的源代码。可以缩写为l ,点击回车键重复上面的命令

l执行gdb

gdb gdb_tst

l设置断点

通常至少要设一个断点,要不然gdb会直接运行到程序结束.

b main #在主函数入口设断点

l设置命令行参数

如果程序需要用到命令行参数,直接在gdb命令是无法输入

set args可指定运行时参数。

l如:gdb >setargs 1020 30 40 50

l开始调试

进入gdb提示符后,gdb并没有进调试状态

需要用r,run进行调试

删除断点:

info break

delete 1

l当程序被停住了,你可以用continue命令恢复程序的运行直到程序结束,或下一个断点到来。也可以使用stepnext命令单步跟踪程序。

continue[ignore-count]
    c [ignore-count]
   fg [ignore-count]

l       恢复程序运行,直到程序结束,或是下一个断点到来。ignore-count表示忽略其后的断点次数。continuecfg三个命令都是一样的意思。

step <count>

l       单步跟踪,如果有函数调用,他会进入该函数。进入函数的前提是,此函数被编译有debug信息。很像VC等工具中的step in。后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。

next <count>

l       同样单步跟踪,如果有函数调用,他不会进入该函数。很像VC等工具中的step

set step-mode
    set step-mode on

l       打开step-mode模式,于是,在进行单步跟踪时,程序不会因为没有debug信息而不停住。这个参数有很利于查看机器码。 

set step-mod off

l       关闭step-mode模式。

finish

l       运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。相当于VCstep out

untilu
       当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。

 

stepisi
   nextini
       单步跟踪一条机器指令!一条程序代码有可能由数条机器指令完成,stepinexti可以单步执行机器指令。与之一样有相同功能的命令是display/i $pc,当运行完这个命令后,单步跟踪会在打出程序代码的同时打出机器指令(也就是汇编代码) 

 

       查看汇编代码  :
       set step-mode on
       display/i $pc         
       si          //单步执行
       修改寄存器内容:
      (gdb) set $eax = 0 
       ---- 通过set命令修改eax的值,与变量不同,修改寄存器的值时,需要在寄存器名称前加'$'

 

lGDB主要采用print来查看运行数据

print <expr> #显示表达式值

print /f #f表示格式,print/x按十六进制显示

printfx is %d\n,x  #格式化输出

 

lprint后接结构变量名,则可以把它所有成员打印出来

l查看数组

p*array@len #人为数组,查看内存中的连续对象

如果是静态数组,直接parray

lprint输出格式

x按十六进制格式显示变量。

d按十进制格式显示变量。

u按十六进制格式显示无符号整型。

o按八进制格式显示变量。

t按二进制格式显示变量。

a按十六进制格式显示变量。p/ai

c按字符格式显示变量。p/ci

f按浮点数格式显示变量print显示实例

print显示实例

l(gdb)pi

$21= 101

l(gdb)p/ai

$22= 0x65

l(gdb) p/ci

$23= 101 'e'

l(gdb)p/fi

$24= 1.41531145e-43

l(gdb) p/xi

$25= 0x65

l(gdb)p/ti

$26= 1100101

可以修改变量的值:

p x=5

可以调用函数

p fun(x)

查看内存 

l使用examine命令(简写是x)来查看内存地址中的值。

lx命令的语法如下所示

x/nfu是可选的参数

–s 查看字符串 (gdb) x/s 0x804a2cf
               0x804a2cf: "%d %d"

n是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。

f表示显示的格式,跟print的格式参数相同

u表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4bytesu参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。

n/f/u三个参数可以一起使用

x/3uh 0x54320表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。 

Watch:设置观察点

jump 15:跳转

Hook-stop 每次到断点时执行的命令

disassemble main // 查看汇编代码

32bit
  set disassembly-flavor intel
  define hook-stop
  info registers
  x/24wx $esp
  x/5i $eip
  end
  
  
      
64bit
  set disassembly-flavor intel
  define hook-stop
  info registers
  x/24wx $rsp
  x/5i $rip

 

更多见:https://www.kancloud.cn/itfanr/i-100-gdb-tips/81952

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值