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 的独立工具
- pai-strace - 类似 strace 的工具
- pai-inject-so - 将 SO 文件注入进程
编译
对于本地构建,可以使用以下方式编译
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_SINGLESTEP
在Aarch32
或Riscv64
上不正确工作。这是对Aarch32
的故意限制,我不确定是否也适用于Riscv64
。- 作为替代方案,我们在指令之后插入一个新的断点来模拟单步。
- 这个替代方案显然有缺陷,因为下一个指令可能是一个分支。这目前没有被检测到,因此步骤将被完全错过。
- 即使没有使用单步执行,此错误也可能出现,因为在这种情况下,单步执行被内部用于需要在下一条指令上重做某些操作的情况,例如重新插入断点。
已知的交叉编译问题
mips-unknown-linux-musl
- 可能也适用于其他mips目标
- https://github.com/rust-lang/rust/issues/108835#issuecomment-1636983993
- 使用以下命令构建:
RUSTFLAGS='-C opt-level=1' cargo build -Zbuild-std=std --target mips-unknown-linux-musl
依赖项
~7–17MB
~235K SLoC