参考

linux常用脚本

VSCode作为zynq相关编辑器的配置

Linux 底层调试命令

—— dd / hexdump / od / cmp / printf / xxd / strings / tr 等

本文关注的是 “字节级工具”
驱动 / FPGA / 嵌入式 / initramfs / 协议调试 的必需品。


一、命令分层

可以把这些命令分为 5 层:

  1. 数据生成(造数据)
  2. 数据搬运(I/O)
  3. 数据观察(dump)
  4. 数据比较(验证)
  5. 数据变换(处理)

二、dd —— 原始 I/O 的王者

2.1 dd 是什么?

dd 是一个 按块复制字节流 的工具


2.2 基本语法

dd if=<输入> of=<输出> bs=<块大小> count=<块数>

2.3 常用参数详解

参数 说明
if 输入文件或设备
of 输出文件或设备
bs 块大小
count 块数量
skip 输入跳过块
seek 输出跳过块
conv=notrunc 不截断输出文件

2.4 用法

生成固定大小文件

dd if=/dev/zero of=1m.bin bs=1M count=1

偏移写(寄存器 / 协议)

printf "\xAA\x55" | dd of=data.bin bs=1 seek=16 conv=notrunc

设备读取

dd if=/dev/pl_data of=out.bin bs=4K count=1

性能测试

time dd if=/dev/pl_data of=/dev/null bs=64K count=1024

三、hexdump —— 二进制可视化

3.1 hexdump 是干啥的?

把不可读的二进制,变成人类可理解的形式


3.2 最常用模式

hexdump -C file.bin
# 前3行
hexdump -C test_drv.o | head -n 3
# 后3行
hexdump -C test_drv.o | tail-n 3
# 字符串筛选
hexdump -C test_drv.c  | grep "H"
# 字符串筛选或略大小写
hexdump -C data.bin | grep -i "a55"
# 二进制筛选
$: printf "\x01\x02\x03\x04" > raw.bin 
$: grep -oba $'\x01\x02' raw.bin

输出结构:

  • 偏移
  • 十六进制
  • ASCII

3.3 精确控制输出格式(高级)

hexdump -v -e '4/4 "%11u "' -e '"\n"' /dev/pl_data

#解释:
# 4/4:一次读 4 个 4 字节
# %11u:无符号整数
# -e '"\n"':每行换行

3.4 hexdump 是否阻塞?

  • 对普通文件:不阻塞
  • 对字符设备:取决于驱动 read()
  • 对管道:等待数据

四、od —— hexdump 的“理科生版本”

4.1 od 是什么?

od = octal dump

一个更“数学化”的二进制查看工具


4.2 常用参数

od -Ax -tx1 file.bin
参数 含义
-Ax 偏移用十六进制
-tx1 单字节十六进制
-td4 4 字节十进制
-tf 浮点数

4.3 od vs hexdump

项目 hexdump od
可读性
格式灵活性
工程习惯 老 UNIX

4.4 适合场景

  • FPGA 输出寄存器
  • ADC 原始数据
  • 浮点格式检查

五、cmp —— 二进制对比神器

5.1 cmp 是什么?

cmp 用来 比较两个文件的字节是否完全一致


5.2 基本用法

cmp a.bin b.bin
  • 无输出:完全相同
  • 有输出:报告第一个不同字节

5.3 静默模式(脚本必备)

cmp -s a.bin b.bin
echo $?   # 0 相同,1 不同

5.4 工程级用途

  • DMA 前后数据校验
  • Flash 写入校验
  • 回环验证

5.5 cmp vs diff

项目 cmp diff
对象 二进制 文本
输出 简洁 详细
是否结构化

六、xxd —— hexdump + 反编译能力

6.1 xxd 是什么?

xxd 不仅能 dump,还能 反向生成二进制


6.2 基本用法

xxd file.bin

6.3 反向生成(二进制“反汇编”)

xxd dump.txt > dump.hex
xxd -r dump.hex > file.bin

👉 hexdump / od 做不到


七、printf —— shell 中的“二进制画笔”

7.1 printf 能干啥?

  • 格式化文本
  • 输出精确字节
  • 构造协议帧

7.2 输出原始字节

printf "\x01\x02\x03\x04" > raw.bin

7.3 和 dd 联用

printf "\xDE\xAD\xBE\xEF" | dd of=mem.bin bs=1 seek=128 conv=notrunc

八、strings —— 从二进制中“捞文本”

8.1 strings 是什么?

提取二进制中的可打印字符串


8.2 用途

strings firmware.bin
strings vmlinux

8.3 工程场景

  • 固件分析
  • 版本号确认
  • Debug 信息确认

九、tr —— 字节级替换工具

9.1 tr 是什么?

tr 用来 逐字节映射 / 删除


9.2 示例

删除所有 0x00:

tr -d '\000' < data.bin

9.3 简单编码处理

tr a-z A-Z < file.txt

十、stat / wc / cat -A

10.1 stat

查看 inode / block / 时间戳

stat file.bin  

10.2 wc

wc -c file.bin   # 字节数

10.3 cat -A

显示不可见字符

cat -A file.txt  

十一、组合使用

11.1 DMA 验证流程

printf "\x01\x02\x03\x04" > in.bin  
dd if=in.bin of=/dev/pl_dma  
dd if=/dev/pl_dma of=out.bin  
cmp in.bin out.bin

11.2 寄存器观察

watch -n 1 "od -Ax -tx4 /dev/pl_reg"

十二、grep —— 文本搜索利器

12.1 grep 是什么?

grep 用来 在文件或输入流中查找匹配模式的行
对驱动、FPGA、嵌入式日志非常有用,快速定位调试信息。

12.2 基本用法

grep "字符串" file.txt
选项 说明
-r / -R 递归搜索目录
-i 忽略大小写
-n 显示行号
-l 只显示文件名
–color=auto 高亮匹配内容
-v 显示不匹配的行
-o 只输出匹配内容
# 在当前目录及子目录搜索 dev_info
grep -rin --color=auto "dev_info" .

# 查找 hexdump 输出中包含 a55 的行
hexdump -C data.bin | grep -i "a55"

# 找出所有 C 文件中包含某函数的文件名
grep -rl "my_function" *.c
# 递归搜索哪个文件含有hello
grep -r "hello" .

十三、sed —— 流式文本处理器

13.1 sed 是什么?

sed = stream editor,能在文本流中查找、替换、删除、插入
对日志处理、文件批量修改、协议模拟很有用。

13.2 基本语法

sed [选项] ‘命令’ 文件

  • s/pattern/replace/ → 替换
  • d → 删除行
  • p → 打印匹配行
  • 支持正则表达式

示例:

替换文件中所有 foo 为 bar(输出到终端,不修改原文件)

sed 's/foo/bar/g' file.txt

删除包含 debug 的行

sed '/debug/d' logfile.txt

只打印包含 init 的行

sed -n '/init/p' file.txt

使用管道处理

dmesg | sed -n '/error/p'

高级用法

  • 多行处理:
sed -n '1,10p' file.txt   # 打印前 10 行
  • 原地修改文件:
sed -i 's/foo/bar/g' file.txt
  • 与 grep 配合:
hexdump -C data.bin | grep "01 02" | sed 's/  /-/g'

十四、总结

工具 角色
dd 搬运工
hexdump 眼睛
od 理科视角
cmp 判官
printf 画笔
xxd 可逆工具
strings 探针
grep 筛子 / 定位器
sed 改造工 / 流式编辑器
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐