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

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: 显示源码文件名和行号。

http://www.kler.cn/a/579961.html

相关文章:

  • U1.【UVA】块问题-The Blocks Problem(补充了pair的使用)
  • c语言笔记 内存管理之栈内存
  • GPT-4 Turbo的重大升级与深远影响
  • Java反射与动态代理:框架设计的基石
  • Android Retrofit 框架注解定义与解析模块深度剖析(一)
  • 利用LLMs准确预测旋转机械(如轴承)的剩余使用寿命(RUL)
  • 【开源】OpenAL、OpenCL、OpenCV 和 OpenGL
  • Git Fast-forward 合并详解:原理、场景与最佳实践
  • 安全保障:渲染101如何守护用户数据?
  • BT-Basic函数之首字母C
  • 数据结构第六节:二叉搜索树(BST)的基本操作与实现
  • C++设计模式-简单工厂模式:从原理、应用、实践指南与常见问题和解决方案深度解析
  • 洛谷P1109 学生分组
  • [Unity3D] 动态立方体贴图系统
  • Android JNI性能优化与字符串加载实践
  • ctf-WEB: 关于 GHCTF Message in a Bottle plus 与 Message in a Bottle 的非官方wp解法
  • 我的GraphQL工具实战:用Apipost提升开发效率的真实体验
  • 【由技及道】API契约的量子纠缠术:响应封装的十一维通信协议(全局的返回结果封装)【人工智障AI2077的开发日志012】
  • vue3学习-3(逻辑复用)
  • Linux的基础操作指令