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 * 2dump 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)。
注意事项
- 权限问题:如果目标内存区域未映射或不可读,GDB 会报错 Cannot access memory。
- 大文件处理:转储大块内存可能生成巨型文件,建议结合 dd 或 hexdump 分析。
- 地址对齐:确保地址有效(可通过 info proc mappings 查看合法地址范围)。
- 分析转储文件
保存后的二进制文件可以用以下工具分析:
- 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: 显示源码文件名和行号。