Strace 6.15构建和在开源鸿蒙PC上运行实战教程
摘要:本文详细记录了在OpenHarmony系统中使用命令OHOS_ARCH=aarch64 OHOS_ABI=arm64-v8a sh ./create-hnp.sh构建Strace 6.15工具的全过程。内容涵盖构建环境配置、构建链路解析、关键日志节点、常见问题解决方案以及产物验证方法。Strace作为Linux系统重要的调试工具,可用于跟踪系统调用、分析程序行为、诊断性能问题等场景。
·
本文记录使用命令 OHOS_ARCH=aarch64 OHOS_ABI=arm64-v8a sh ./create-hnp.sh 构建 Strace 6.15 的完整过程,包括环境、构建链路、关键日志、常见问题与解决方案、产物验证与重建方法,便于复现与运维。
📖 Strace 简介
Strace 是一个用于跟踪系统调用和信号的 Linux 诊断、调试和教学工具。它通过 ptrace 系统调用拦截和记录进程与内核之间的交互,显示系统调用的参数、返回值和执行时间,是系统级调试和性能分析的重要工具。
🎯 Strace 的作用与重要性
Strace 是系统级调试和性能分析的核心工具,提供了:
- 系统调用跟踪:跟踪程序执行的所有系统调用
- 参数显示:显示系统调用的参数和返回值
- 性能分析:统计系统调用次数和执行时间
- 问题诊断:帮助定位程序运行异常和性能瓶颈
- 教学工具:用于学习 Linux 系统调用和内核交互
- 安全审计:监控程序的系统调用行为
🔧 Strace 核心特性
1. 系统调用跟踪
- 完整跟踪:跟踪所有系统调用和信号
- 选择性跟踪:只跟踪特定的系统调用
- 过滤功能:根据进程、系统调用类型等过滤输出
- 统计信息:统计系统调用次数和执行时间
2. 输出格式
- 详细模式:显示完整的系统调用参数和返回值
- 摘要模式:只显示系统调用名称和返回值
- 时间戳:显示系统调用的时间戳
- 相对时间:显示系统调用之间的时间间隔
3. 性能分析
- 调用统计:统计每个系统调用的调用次数
- 时间统计:统计系统调用的总时间和平均时间
- 错误统计:统计系统调用错误次数和类型
- 性能报告:生成性能分析报告
4. 调试功能
- 信号跟踪:跟踪进程接收和发送的信号
- 文件操作跟踪:跟踪文件打开、读写、关闭操作
- 网络操作跟踪:跟踪网络套接字操作
- 进程操作跟踪:跟踪进程创建、终止等操作
5. 应用场景
- 程序调试:定位程序运行异常和错误
- 性能优化:分析程序性能瓶颈
- 安全审计:监控程序的系统调用行为
- 教学研究:学习 Linux 系统调用和内核交互
- 问题排查:排查系统级问题和故障
🚀 构建入口与环境
- 📝 执行命令:
OHOS_ARCH=aarch64 OHOS_ABI=arm64-v8a sh ./create-hnp.sh - 🔧 入口脚本:
create-hnp.sh- 检查必需的环境变量
OHOS_ARCH和OHOS_ABI - 导出
LC_CTYPE、TOOL_HOME、OHOS_SDK_HOME - 执行
make -C build-hnp
- 检查必需的环境变量
- 📦 顶层构建:
build-hnp/MakefilePKGS变量定义需要构建的包列表(包含strace)- 通过
check-pkgs机制自动检测PKGS变化并触发重新构建 - 自动合并
external-hnp目录下的外部 HNP 包 base.hnp依赖所有包的.stamp和外部 HNP 包- 总目标
all: copy,打包base.hnp并拷贝到entry/hnp/$(OHOS_ABI)
⚙️ Strace 包的构建配置
- 📁 包目录:
build-hnp/strace/Makefile- 继承通用规则:
include ../utils/Makefrag - 源地址:
https://github.com/strace/strace/releases/download/v6.15/strace-6.15.tar.xz - 版本:
6.15
- 继承通用规则:
- ⚙️ Autotools 配置参数:
--prefix=$(PREFIX)- 安装前缀(/data/app/base.org/base_1.0)--host $(OHOS_ARCH)-unknown-linux-musl- 目标平台--enable-mpers=no- 关闭多架构指针尺寸支持,简化构建并减少不必要依赖CFLAGS="-Wno-error"- 放宽编译告警为错误的限制,提升在 OHOS 环境下的兼容性
- 🔨 构建流程:
- 下载源码包(支持多镜像回退)
- 解包并进入
temp/strace-6.15目录 - 运行
./configure配置构建系统 - 使用
make -j $(nproc)并行编译 - 使用
make install安装 - 执行 ELF strip 减小体积
- 复制到
../sysroot
- 🔧 通用工具链与路径:
build-hnp/utils/MakefragCC/CXX/LD/AR/RANLIB/...均指向 OHOS SDK 的 LLVM 工具链- 下载支持多镜像回退:
wget→curl,主镜像失败时自动尝试备用镜像
📋 关键日志与过程节点
- 📥 下载与解包:
- 从 GitHub Releases 下载
strace-6.15.tar.xz - 完成解包并进入
temp/strace-6.15目录 - 下载规则支持多镜像回退:
wget→curl兜底
- 从 GitHub Releases 下载
- ⚙️ 配置阶段:
- 运行
./configure --enable-mpers=no --prefix=... --host=aarch64-unknown-linux-musl CFLAGS="-Wno-error" ... - 配置成功,禁用 mpers 支持
- 生成
Makefile和构建配置
- 运行
- 🔨 编译与安装:
- 使用
make -j $(nproc)并行编译 - 成功编译生成
strace和strace-log-merge二进制 - 使用
make install安装到临时前缀 - 执行
llvm-strip剥离二进制符号 - 复制到
../sysroot
- 使用
- 📦 打包:
- 完成
base.hnp重打包,拷贝产物到entry/hnp/arm64-v8a/ - Strace 工具已成功打包到
base.hnp中
- 完成
✅ 产物验证
📦 检查打包文件
ls build-hnp/base.hnp # 应存在
ls entry/hnp/arm64-v8a/*.hnp # 应包含 base.hnp 与 base-public.hnp
🔍 检查二进制文件
# 检查 strace 二进制
ls -lh build-hnp/sysroot/bin/strace
file build-hnp/sysroot/bin/strace
# 检查 strace-log-merge 工具
ls -lh build-hnp/sysroot/bin/strace-log-merge
file build-hnp/sysroot/bin/strace-log-merge
✅ 构建验证结果:
- ✅ Strace 二进制已成功安装:
strace(1.8M) - 主程序二进制strace-log-merge(1.8K) - 日志合并工具
- ✅ 文件类型:ELF 64-bit LSB pie executable, ARM aarch64
- ✅ 动态链接:interpreter
/lib/ld-musl-aarch64.so.1 - ✅ 已剥离符号:
stripped - ✅ 已打包到
base.hnp中(1,862,432 字节)
💻 终端中执行的示例命令
🔍 Strace 基本使用

1. 跟踪程序执行
# 跟踪简单命令
strace ls -la
# 跟踪并显示时间戳
strace -t ls -la
# 跟踪并显示相对时间
strace -r ls -la
# 跟踪并显示系统调用时间
strace -T ls -la
# 跟踪并显示所有时间信息
strace -ttt ls -la
2. 跟踪特定系统调用
# 只跟踪 open 系统调用
strace -e trace=open ls -la
# 只跟踪文件相关系统调用
strace -e trace=file ls -la
# 只跟踪网络相关系统调用
strace -e trace=network curl http://example.com
# 只跟踪进程相关系统调用
strace -e trace=process ps aux
# 跟踪多个系统调用
strace -e trace=open,read,write ls -la
# 排除特定系统调用
strace -e trace=!open ls -la
3. 输出格式控制
# 显示系统调用参数(默认)
strace ls -la
# 不显示系统调用参数
strace -e trace=open -s 0 ls -la
# 限制字符串长度
strace -s 100 ls -la
# 以十六进制显示非ASCII字符
strace -x ls -la
# 以十六进制显示所有字符串
strace -xx ls -la
# 显示原始系统调用号
strace -e raw=all ls -la
4. 跟踪已运行进程
# 跟踪进程 ID
strace -p 1234
# 跟踪进程并附加到子进程
strace -p 1234 -f
# 跟踪进程并显示时间戳
strace -p 1234 -t
# 跟踪进程并统计系统调用
strace -p 1234 -c
5. 统计和摘要
# 统计系统调用
strace -c ls -la
# 统计并显示错误
strace -c -e trace=all ls -la
# 统计特定系统调用
strace -c -e trace=open,read,write ls -la
# 显示系统调用摘要
strace -S calls ls -la
# 显示系统调用时间摘要
strace -S time ls -la
🔍 Strace 高级用法
6. 文件操作跟踪
# 跟踪文件打开
strace -e trace=open,openat ls -la
# 跟踪文件读写
strace -e trace=read,write cat file.txt
# 跟踪文件操作并显示文件名
strace -e trace=file -y ls -la
# 跟踪文件操作并显示文件描述符
strace -e trace=file -y -yy ls -la
# 跟踪文件操作并显示完整路径
strace -e trace=file -y -yy -P /path/to/file ls -la
7. 网络操作跟踪
# 跟踪网络套接字操作
strace -e trace=network curl http://example.com
# 跟踪网络连接
strace -e trace=connect,accept curl http://example.com
# 跟踪网络读写
strace -e trace=sendto,recvfrom curl http://example.com
# 跟踪网络操作并显示套接字信息
strace -e trace=network -y curl http://example.com
8. 信号跟踪
# 跟踪信号
strace -e trace=signal kill -9 1234
# 跟踪所有信号
strace -e trace=all -e signal=all kill -9 1234
# 跟踪特定信号
strace -e trace=signal -e signal=SIGKILL kill -9 1234
# 跟踪信号并显示详细信息
strace -e trace=signal -e verbose=signal kill -9 1234
9. 性能分析
# 统计系统调用时间和次数
strace -c -S time ls -la
# 统计系统调用并按时间排序
strace -c -S time -w ls -la
# 统计系统调用并显示百分比
strace -c -w ls -la
# 统计系统调用并显示错误
strace -c -e trace=all ls -la 2>&1 | grep -v "+++ exited"
10. 实际应用示例
# 调试程序启动问题
strace ./myprogram
# 调试文件访问问题
strace -e trace=open,openat,access ./myprogram
# 调试网络连接问题
strace -e trace=network ./myprogram
# 调试权限问题
strace -e trace=open,access,chmod,chown ./myprogram
# 分析程序性能
strace -c -S time ./myprogram
# 跟踪程序的所有系统调用
strace -e trace=all ./myprogram
# 跟踪程序并保存到文件
strace -o trace.log ./myprogram
# 跟踪程序并过滤输出
strace -e trace=open,read,write -o trace.log ./myprogram
# 跟踪程序并实时查看
strace -e trace=open,read,write ./myprogram | grep -v "+++ exited"
# 跟踪程序并统计错误
strace -c -e trace=all ./myprogram 2>&1 | grep -E "(error|Error|ERROR)"
# 跟踪程序并显示文件描述符
strace -e trace=open,read,write -y ./myprogram
# 跟踪程序并显示完整路径
strace -e trace=file -y -yy ./myprogram
# 跟踪程序并显示时间戳
strace -ttt ./myprogram
# 跟踪程序并显示相对时间
strace -r ./myprogram
# 跟踪程序并显示系统调用时间
strace -T ./myprogram
# 跟踪程序并显示所有时间信息
strace -ttt -r -T ./myprogram
# 跟踪已运行进程
strace -p $(pgrep myprogram)
# 跟踪进程及其子进程
strace -p $(pgrep myprogram) -f
# 跟踪进程并统计系统调用
strace -p $(pgrep myprogram) -c
# 跟踪进程并保存到文件
strace -p $(pgrep myprogram) -o trace.log
# 跟踪进程并实时查看
strace -p $(pgrep myprogram) -e trace=open,read,write
🔧 Strace-log-merge 工具使用
11. 合并 strace 日志
# 合并多个 strace 日志文件
strace-log-merge trace1.log trace2.log trace3.log > merged.log
# 合并并排序
strace-log-merge trace1.log trace2.log | sort > merged.log
# 合并并过滤
strace-log-merge trace1.log trace2.log | grep "open" > filtered.log
🧪 功能验证脚本
#!/bin/bash
# Strace 工具验证脚本
STRACE_BIN="build-hnp/sysroot/bin"
echo "=== Strace 工具验证 ==="
# 检查 strace 二进制
if [ -f "$STRACE_BIN/strace" ]; then
echo "✓ strace: 存在"
file "$STRACE_BIN/strace"
echo "文件大小: $(ls -lh "$STRACE_BIN/strace" | awk '{print $5}')"
echo "架构信息: $(file "$STRACE_BIN/strace" | grep -o "ARM aarch64")"
else
echo "✗ strace: 缺失"
fi
# 检查 strace-log-merge 工具
if [ -f "$STRACE_BIN/strace-log-merge" ]; then
echo "✓ strace-log-merge: 存在"
file "$STRACE_BIN/strace-log-merge"
echo "文件大小: $(ls -lh "$STRACE_BIN/strace-log-merge" | awk '{print $5}')"
else
echo "✗ strace-log-merge: 缺失"
fi
# 测试 strace 基本功能
echo ""
echo "=== 功能测试 ==="
if [ -f "$STRACE_BIN/strace" ]; then
echo "测试 strace 版本信息:"
"$STRACE_BIN/strace" -V 2>&1 | head -1 || echo "无法获取版本信息"
fi
🐛 常见问题与处理
❌ 问题 1:mpers 相关错误
- 🔍 症状:配置或编译时出现 mpers 相关错误
- 🔎 原因:多架构指针尺寸支持在交叉编译环境下可能不兼容
- ✅ 解决方法:
- 在配置时使用
--enable-mpers=no关闭 mpers 支持 - 位置:
build-hnp/strace/Makefile:6
- 在配置时使用
❌ 问题 2:编译警告被当作错误
- 🔍 症状:编译失败,提示警告被当作错误处理
- 🔎 原因:某些编译警告在交叉编译环境下可能无法避免
- ✅ 解决方法:
- 在
CFLAGS中添加-Wno-error放宽编译告警为错误的限制 - 位置:
build-hnp/strace/Makefile:6
- 在
❌ 问题 3:GitHub Releases 不可达
- 🔍 症状:下载失败,无法获取源码包
- 🔎 原因:网络问题或 GitHub 访问受限
- ✅ 解决方法:
- 手动下载源码包放置到
build-hnp/strace/download/strace-6.15.tar.xz - 通用下载逻辑支持备用镜像与重试(
wget→curl) - 位置:
build-hnp/utils/Makefrag:61-69
- 手动下载源码包放置到
❌ 问题 4:架构不支持
- 🔍 症状:
Unsupported OHOS_ARCH= - 🔎 原因:传入的架构不在支持列表中
- ✅ 解决方法:
- 确保传入支持架构(
aarch64或x86_64) - 位置:
build-hnp/Makefile:1-38
- 确保传入支持架构(
❌ 问题 5:链接与头文件异常
- 🔍 症状:链接失败或找不到头文件
- 🔎 原因:交叉工具链或 sysroot 路径不正确
- ✅ 解决方法:
- 检查交叉工具链与
sysroot路径是否正确 - 确保通过
create-hnp.sh触发构建以获得完整环境变量 - 位置:
create-hnp.sh、build-hnp/utils/Makefrag
- 检查交叉工具链与
❌ 问题 6:ptrace 权限问题
- 🔍 症状:运行时错误
ptrace: Operation not permitted - 🔎 原因:目标平台对 ptrace 有权限限制
- ✅ 解决方法:
- 确保程序有足够的权限使用 ptrace
- 在某些平台上可能需要 root 权限或特殊配置
- 这是运行时问题,不是构建问题
❌ 问题 7:系统调用跟踪失败
- 🔍 症状:无法跟踪系统调用或输出为空
- 🔎 原因:目标平台不支持某些系统调用或 ptrace 功能受限
- ✅ 解决方法:
- 检查目标平台是否支持 ptrace
- 尝试使用不同的跟踪选项
- 这是运行时问题,不是构建问题
🔄 重建与扩展
-
🔧 重建单包:
make -C build-hnp rebuild-strace # 触发子包重新编译并刷新 .stamp -
🧹 清理:
make -C build-hnp clean # 清理 sysroot、所有 .stamp 和 PKGS_MARKER -
📦 扩展:Strace 是系统级调试和性能分析的重要工具
-
🔄 自动重建机制:
- 修改
PKGS后,check-pkgs会自动检测变化并触发重新构建 - 新增外部 HNP 包到
external-hnp目录后,会自动合并到base.hnp
- 修改
💡 实践建议
- 🔧 构建配置:关闭 mpers 支持简化构建,使用
-Wno-error提升兼容性 - 🚀 功能使用:根据需求选择合适的跟踪选项和输出格式
- 📦 性能分析:使用
-c选项统计系统调用,使用-T显示执行时间 - 🔗 调试技巧:结合
-e trace=选项跟踪特定系统调用,使用-y显示文件描述符 - 🌐 问题排查:使用
-o保存跟踪日志,使用-f跟踪子进程
📝 结论与建议
- ✅ 本次已在 aarch64 环境下完成 Strace 6.15 的交叉编译与打包,strace 工具已安装到
sysroot并纳入 HNP 包。 - 💡 为保证构建稳定:
- 使用
--enable-mpers=no关闭多架构指针尺寸支持,简化构建 - 使用
CFLAGS="-Wno-error"放宽编译告警为错误的限制 - 确保通过
create-hnp.sh触发构建以获得完整环境变量 - 利用
check-pkgs机制自动检测包列表变化,无需手动清理 - Strace 为系统级调试和性能分析提供了强大的工具支持
- 常见陷阱包括 mpers 支持问题、编译警告处理、网络下载失败;当前已通过配置选项和下载回退机制修复
- Autotools 交叉参数简洁,关闭 mpers 减少复杂性,构建路径稳健
- 产物开箱即用,适合在设备上进行系统调用级别的调试与问题定位
- 使用
📚 以上为 Strace 构建的深度解读与实践记录。
更多推荐



所有评论(0)