当前位置: 首页 > news >正文

gdb调试以及常用相关工具(hexdump\objdump等)

gdb调试以及常用相关工具hexdump\objdump等

  • GDB
    • 1. dump
    • 2. restore
    • 3. info proc mappings
    • 注意事项
  • 其他
    • 1. hexdump
    • 2. objdump

什么是符号表
符号表(Symbol Table)是在编译程序、链接程序以及调试程序等过程中用于存储和管理符号信息的数据结构。这里的符号可以是变量名、函数名、类名、标号等,以下从多个方面详细介绍符号表:
基本概念
在程序的编译和执行过程中,编译器和链接器需要知道各种标识符(符号)对应的地址、类型、作用域等信息,符号表就是用来存储这些信息的地方。它就像一个字典,将符号和与之相关的属性关联起来,方便编译器和其他工具在不同阶段进行查找、插入、删除和修改操作。

GDB

1. dump

在 GDB 中,dump 是一个非常有用的命令,可以将内存内容、寄存器值或其他数据保存到文件中,方便后续分析或恢复状态。以下是 dump 命令的高级用法和相关操作:

基本语法:

dump [格式] [目标文件] [起始地址] [结束地址]

官方的help dump

(gdb) help dump Dump target code/data to a local file.

List of dump subcommands:

dump binary – Write target code/data to a raw binary file.
dump ihex – Write target code/data to an intel hex file.
dump memory – Write contents of memory to a raw binary file.
dump srec – Write target code/data to an srec file.
dump tekhex – Write target code/data to a tekhex file.
dump value – Write the value of an expression to a raw binary file.
dump verilog – Write target code/data to a verilog hexfile.

dump binary
功能:将目标代码/数据写入原始二进制文件(raw binary file)。
用途:适用于直接转储内存或代码段的二进制内容(如固件提取)。
eg: dump binary memory output.yuv yuv_buf yuv_buf + WIDTH * HEIGHT * 2

dump ihex
功能:将目标代码/数据写入 Intel Hex 格式文件。
用途:兼容微控制器编程工具(如 Flash 烧录)。

dump memory
功能:将内存内容写入原始二进制文件。
用法示例:gdb 复制 (gdb) dump memory output.bin 0x400000 0x401000
dump srec
功能:将目标代码/数据写入 S-record 格式文件(Motorola 标准)。
用途:嵌入式系统调试或 ROM 数据生成。

dump tekhex
功能:将目标代码/数据写入 Tekhex 格式文件。 注:Tektronix扩展的十六进制格式,适用于特定硬件工具。

dump value
功能:将表达式的值写入原始二进制文件。 示例:
(gdb) dump value data.bin r s p ( rsp ( rsp(rsp + 64) # 保存栈顶64字节
dump verilog
功能:将目标代码/数据写入 Verilog 十六进制文件。
用途:硬件仿真时初始化内存(如 FPGA 或 ASIC 验证)

2. restore

恢复内存内容,使用 restore 命令可以将保存的文件内容加载到内存:
restore <文件名> binary [地址偏移]
(gdb) restore output.bin binary 0x555555554000

3. info proc mappings

在 GDB 中使用 info proc mappings
启动 GDB 并附加到目标进程(或调试程序),然后在 GDB 命令行中输入:

(gdb) info proc mappings
这会输出进程的内存映射信息,例如:

Start Addr   End Addr       Size     Offset  Perms  objfile
0x555555554000 0x555555556000 0x2000     0x0  r-xp   /path/to/program
0x555555756000 0x555555757000 0x1000     0x0  r--p   /path/to/program
0x555555757000 0x555555758000 0x1000     0x0  rw-p   /path/to/program

记录需要转储的内存地址范围(如代码段 0x555555554000 到 0x555555556000)。

注意事项

  1. 权限问题:如果目标内存区域未映射或不可读,GDB 会报错 Cannot access memory。
  2. 大文件处理:转储大块内存可能生成巨型文件,建议结合 dd 或 hexdump 分析。
  3. 地址对齐:确保地址有效(可通过 info proc mappings 查看合法地址范围)。
  4. 分析转储文件

保存后的二进制文件可以用以下工具分析:

  • hexdump:查看十六进制内容 hexdump -C output.bin
  • objdump:反汇编代码段objdump -D -b binary -m i386:x86-64 output.bin
  • exec-file: 自身:直接加载分析 (gdb) exec-file <原程序> (gdb) target exec-file <转储文件>
  • info proc mappings 查看合法内存地址范围,避免转储无效区域。

通过结合 dump 和外部工具,你可以更高效地调试复杂的内存问题(如缓冲区溢出、数据损坏等)。

其他

1. hexdump

hexdump 是一个 Linux 工具,用于查看二进制文件的十六进制内容,不能直接输入 hexdump 不加参数。使用 hexdump 分析导出的文件,在终端(非 GDB)中使用 hexdump 查看导出的二进制文件:

hexdump -C output.bin
-C 参数会同时显示十六进制和 ASCII 内容,例如:

00000000  7f 45 4c 46 02 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  03 00 3e 00 01 00 00 00  a0 10 00 00 00 00 00 00  |..>.............|
  • hexdump 常用参数
    参数 功能
    -C 显示十六进制和 ASCII 对照
    -n <长度> 仅显示前 N 字节(如 -n 64)
    -s <偏移> 从指定偏移开始(如 -s 0x100)

  • 若文件较大,可结合 less 分页查看:

hexdump -C output.bin | less

2. objdump

反汇编二进制文件, 反汇编整个代码段(需指定架构,如 x86-64):

objdump -D -b binary -m i386:x86-64 output.bin
  • 参数说明:
    -D: 反汇编所有段(代码和数据)。
    -b binary: 指定输入文件为原始二进制格式。
    -m i386:x86-64: 指定目标架构(根据实际调整)。

  • 查看程序段头信息
    显示 ELF 文件的段(Section)信息:objdump -h /path/to/program
    输出示例:

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .text         000001a0  0000000000000000  0000000000000000  00000040  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  • 反汇编特定函数
    反汇编可执行文件中的 main 函数:
    objdump -d /path/to/program --disassemble=main
  • 查看符号表
    显示二进制文件的符号(函数、全局变量):
    objdump -t /path/to/program
0000000000000000 g     F .text  0000000000000015 main
  • 混合显示源码与汇编(需编译时加 -g)
    objdump -S -l -d /path/to/program
    参数说明:
    -S: 混合显示源码和汇编。
    -l: 显示源码文件名和行号。

相关文章:

  • Node.js与VUE安装
  • 化工厂防爆气象站:为石油化工、天然气等领域提供安全保障
  • 在 Axios 中设置代理
  • BGP实验(一)IBGP全互联配置
  • Android TCP封装工具类
  • 【Linux docker】关于Docker 守护程序配置远程访问,安全认证以及idea连接。
  • 高效获取历史行情数据:xtquant的实战应用
  • SpringCloud——CircuitBreaker断路器
  • 电脑维修保养售后服务跟踪软件到哪里下载,佳易王电脑保养维护记录查询可导入图片管理系统操作教程
  • 无法打开包括文件: “QGLWidget”: No such file or directory
  • 位运算操作符(移位操作符)
  • 【3DMAX插件】3DMAX建筑大师插件MasterBuilder使用方法
  • Java/Kotlin逆向基础与Smali语法精解
  • 十分钟临时邮箱服务源码带api
  • pytest数据库测试文章推荐
  • DICOM医学影像脱敏技术应用的重要性及其实现方法详解
  • 命名管道的创建和通信实现
  • cesium地图设置3d,2d,2.5d动态切换
  • 企业员工薪酬关系系统的设计与实现(代码+数据库+LW)
  • 全球首款 5G-A 人形机器人发布
  • 上海:5月8日起5年以上首套个人住房公积金贷款利率下调至2.6%
  • 央行宣布优化两项支持资本市场的货币政策工具
  • 牛市早报|金融政策支持稳市场稳预期发布会将举行,商务部:中方决定同意与美方进行接触
  • 苹果用户,安卓来“偷心”
  • 柳向春:关于美国国会图书馆所藏《全芳备祖》的一些故事
  • 五一假期上海境外来沪消费4.55亿元,同比增长211.6%