#syscalls #debugging #strace #instrumentation #trace

nightly no-std pai

进程分析器和仪器

11 个版本

0.1.11 2024 年 3 月 9 日
0.1.10 2024 年 3 月 4 日
0.1.7 2024 年 2 月 13 日
0.1.5 2024 年 1 月 31 日

#5 in #strace


用于 2 crates

自定义许可证

380KB
11K SLoC

pai

进程分析器和仪器

推荐包含包的方式,即使 API 预计不会在版本 0.2.0 中稳定,也是

pai = { version = "0.1", features = ["syscalls"] }

功能 syscalls 只有在你想要解析系统调用参数时才需要。所以如果你想将系统调用编号解析为名称,将参数解析为字符串等。

examples/ 下的使用示例,当 API 更稳定时将提供更多信息。

使用 pai 的独立工具

编译

对于本地构建,可以使用以下方式编译

cargo build --all-features

交叉编译

推荐交叉编译的方式是使用 cross

这已在 Makefile.toml 中设置,因此你可以使用以下方式为所有期望的目标构建

cargo make build i686-unknown-linux-gnu x86_64-unknown-linux-gnu ...

来自 cross 的构建输出有时会干扰来自 cargo 的构建输出,因此所有 cross 构建都将进入目录 output/,留下 target/ 用于常规 cargo 命令。

然后构建将按预期工作,但大多数测试目标将失败,因为所使用的测试方法不支持 ptrace

要正确运行交叉架构测试,请参阅 testing.md

测试目标

我们不想测试所有交叉组合的构建,而是尝试测试所有支持的平台和所有支持的架构。

  • 平台: GNU、Android、Musl
  • 架构: x86_64、x86、Aarch64、Aarch32

在发布新版本之前,将执行 Makefile.toml 目标 fulltest

已知问题

  • PTRACE_SINGLESTEPAarch32Riscv64 上不正确工作。这是对 Aarch32 的故意限制,我不确定是否也适用于 Riscv64
    • 作为替代方案,我们在指令之后插入一个新的断点来模拟单步。
    • 这个替代方案显然有缺陷,因为下一个指令可能是一个分支。这目前没有被检测到,因此步骤将被完全错过。
    • 即使没有使用单步执行,此错误也可能出现,因为在这种情况下,单步执行被内部用于需要在下一条指令上重做某些操作的情况,例如重新插入断点。

已知的交叉编译问题

依赖项

~7–17MB
~235K SLoC