本文记录使用命令 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_ARCHOHOS_ABI
    • 导出 LC_CTYPETOOL_HOMEOHOS_SDK_HOME
    • 执行 make -C build-hnp
  • 📦 顶层构建build-hnp/Makefile
    • PKGS 变量定义需要构建的包列表(包含 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 环境下的兼容性
  • 🔨 构建流程
    1. 下载源码包(支持多镜像回退)
    2. 解包并进入 temp/strace-6.15 目录
    3. 运行 ./configure 配置构建系统
    4. 使用 make -j $(nproc) 并行编译
    5. 使用 make install 安装
    6. 执行 ELF strip 减小体积
    7. 复制到 ../sysroot
  • 🔧 通用工具链与路径build-hnp/utils/Makefrag
    • CC/CXX/LD/AR/RANLIB/... 均指向 OHOS SDK 的 LLVM 工具链
    • 下载支持多镜像回退:wgetcurl,主镜像失败时自动尝试备用镜像

📋 关键日志与过程节点

  • 📥 下载与解包
    • 从 GitHub Releases 下载 strace-6.15.tar.xz
    • 完成解包并进入 temp/strace-6.15 目录
    • 下载规则支持多镜像回退:wgetcurl 兜底
  • ⚙️ 配置阶段
    • 运行 ./configure --enable-mpers=no --prefix=... --host=aarch64-unknown-linux-musl CFLAGS="-Wno-error" ...
    • 配置成功,禁用 mpers 支持
    • 生成 Makefile 和构建配置
  • 🔨 编译与安装
    • 使用 make -j $(nproc) 并行编译
    • 成功编译生成 stracestrace-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 基本使用

image-20251124114144317

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
    • 通用下载逻辑支持备用镜像与重试(wgetcurl
    • 位置:build-hnp/utils/Makefrag:61-69

❌ 问题 4:架构不支持

  • 🔍 症状Unsupported OHOS_ARCH=
  • 🔎 原因:传入的架构不在支持列表中
  • ✅ 解决方法
    • 确保传入支持架构(aarch64x86_64
    • 位置:build-hnp/Makefile:1-38

❌ 问题 5:链接与头文件异常

  • 🔍 症状:链接失败或找不到头文件
  • 🔎 原因:交叉工具链或 sysroot 路径不正确
  • ✅ 解决方法
    • 检查交叉工具链与 sysroot 路径是否正确
    • 确保通过 create-hnp.sh 触发构建以获得完整环境变量
    • 位置:create-hnp.shbuild-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 构建的深度解读与实践记录。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐