gdb调试-基础(1)

前言

gdb调试不同于界面化的调试,虽然命令非常简单,但上手比较有难度。对于从没使用过gdb的人来说,可以考虑装一个Python插件(gef),当然也可以不装,只是为了方便显示调试信息而已。会使用gdb的可以直接跳到后面阅读(附有gdb操作命令)

插件安装步骤
  1. 以普通用户身份, 进入用户目录
    cd ~

  2. 安装gef插件(必须gdb7.7以上)

    wget -q -O- https://github.com/hugsy/gef/raw/master/scripts/gef.sh | sh


1.编译程序

  1. 将程序编译为可以被gdb调试的版本(-g 为程序加上符号表)
    gcc -g program.c -o program

  2. 查看符号表
    readelf -s program

2.启动GDB

  1. gdb有多种启动方式

     1.本地普通启动 
     	gdb <program>  
     	
     2.attach到某个进程启动 
     	gdb attach <PID>
    
     3.使用本地core文件启动 
     	gdb <program> core
    
     4.远程启动 
     	gdb server 0.0.0.0:1234 /path/to/file
    

3.基础命令

命令简写命令全拼含义
llist显示程序
bbreak设置断点
ccontinue到下一个断点
nnext下一行(不进入函数内部)
sstep下一行(进入函数内部)
uuntil完成当前循环体
ffinish完成当前函数
p/fprint打印
x/nfuexamine查看内存
btbacktrace函数调用堆栈
-set args设置函数参数
-set listsize设置每次显示行数
i binfo breakpoints显示断点信息
i finfo frame显示栈内信息
i rinfo registers显示寄存器信息
i loinfo locals显示局部变量信息
qquit退出
-shell使用shell命令
命令使用技巧
  1. 设置函数参数

     set args 20
    
  2. 设置GDB信息显示窗口的行数

     set listsize 20  
    
  3. 条件断点的设置

     b 20 if (i>5)
    
  4. 修改内存

     p i=20
    
  5. 打印具体长度的值

     p iNumber@20
    
  6. 操作断点

     disable 1
     enable  1
     delete  1
    
  7. 设置观察点-观察的内存发生改变(硬件断点)

     watch 0x0000
    
  8. 设置捕捉点

     catch event
     event可以是以下: 
     1.throw 抛出一个C++的异常 catch throw  
     2.catch 捕捉一个C++的异常 catch catch  
     3.exec  调用系统调用exec时停止 catch exec  
     4.fork  调用系统调用fork时停止 catch fork  
     5.load/load libname 载入动态链接库时 catch load / catch load libname  
     6.unload  
    
  9. x命令的参数(查看内存)

     x/n,f,u
     n 是一个正整数,表示显示内存的长度  
     f 表示显示的格式(与print一致)  
     u 表示从当前地址往后请求的字节数(GDB默认为4byte)  
    
源代码中搜索
  1. 全部搜索

     reverse-search <regexp>
    
  2. 向前搜索

     forward-search <regexp>  
    
  3. 搜索(内存搜索)

     search <regexp>  
    

gdb多线程、多进程调试可以参考下篇

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值