#syscalls #strace #trace

app pai-strace

使用pai创建的类似strace的工具

9个版本

0.1.8 2024年3月9日
0.1.7 2024年3月4日
0.1.5 2024年2月13日
0.1.2 2024年1月31日

#95 in 操作系统

Download history 11/week @ 2024-03-28 1/week @ 2024-04-04 1/week @ 2024-05-16

每月下载量441次

自定义许可证

24KB
494

pai-strace

使用pai创建的类似strace的工具

安装

cargo install --force pai-strace

检查新版本是否可用

pai-strace --check-update

在未安装cargo的目标上使用,请参阅发布

开发状态

处于开发中,可能存在一些错误。

编译

cargo-make用于控制构建过程。 cross用于支持交叉编译。为了简化构建过程,即使在为主机目标编译时也使用cross

构建目标的命令是

cargo make [build|release] [target(s)]

输出将放在output/<target>/<debug|release>/pai-strace

如果不指定任何目标,它将位于output/<debug|release>/pai-strace

一些其他有用的make目标

  • cargomake clippy
    • 应在每次提交前运行
  • cargomake publish
    • 在crates.io上发布新版本
  • cargomake release[target1 target2 targetN]
    • 为给定目标构建发布版本
  • cargomake releasecheck
    • 运行publishrelease目标的依赖项,而不发布或发布任何内容。
    • 不会在未提交的更改上运行,因此不需要在提交前运行此命令
  • cargomake update
    • 更新Cargo.lock中的所有依赖项
    • 这是releasecheck的一部分

如何使用

有关更多命令,请参阅--help,但以下是一些示例,每个示例都简单地启动了true命令。

最基本命令是只将所有系统调用打印到stdout。

pai-strace true

以下是一个示例,将原始格式和json格式写入文件,分别是calls.txtcalls.json

pai-strace --format json --format raw --output calls true

在以下先前的示例中,您可能已经看到类似以下内容

[594079]: openat(fd=0xffffff9c, file=0x7ff1d2a7121b, flags=0x80000, mode=0x0) = 0x3

这并没有提供太多关于文件如何打开的信息。为了提供更多上下文,我们可以提供--enrich参数。

pai-strace --enrich basic true

现在行变成了。

[594137]: openat(fd=fd(AT_FDCWD), file=ptr(7f363802421b), flags=flags(O_CLOEXEC), mode=flags()) = fd(3)

现在我们可以看到文件描述符是常量,以及传递的标志名称。

然而我们仍然不知道文件名,为了读取指针,我们可以传递--enrich full参数

pai-strace --enrich full true

输出现在变成了

[594176]: openat(fd=fd(AT_FDCWD), file="/etc/ld.so.cache", flags=flags(O_CLOEXEC), mode=flags()) = fd(3)

唯一的区别是文件名已经被解析。原始格式raw省略了一些信息,上面命令的完整信息在json格式中包括以下内容。它包括用于推导标志、字符串等的实际值,还包括参数的方向。在这种情况下,所有参数都是输入。

{
 "tid": 594246,
 "sysno": 257,
 "name": "openat",
 "args": [
 {
  "name": "fd",
  "value": {
  "raw_value": 4294967196,
  "parsed": {
   "FdConst": {
    "value": -100,
    "name": "AT_FDCWD"
   }
  }
 },
  "dir": "In"
 },
 {
  "name": "file",
  "value": {
   "raw_value": 139771623875099,
   "parsed": {
    "String": {
    "string": "/etc/ld.so.cache"
   }
  }
 },
  "dir": "In"
 },
 {
  "name": "flags",
  "value": {
   "raw_value": 524288,
   "parsed": {
   "Flag": {
    "set": [
     "O_CLOEXEC"
    ]
   }
  }
 },
  "dir": "In"
 },
 {
  "name": "mode",
  "value": {
  "raw_value": 0,
  "parsed": {
   "Flag": {
    "set": []
   }
  }
 },
  "dir": "In"
 }],
 "output": {
  "raw_value": 3,
  "parsed": {
   "Fd": {
    "fd": 3
   }
  }
 }
}

依赖

~15–30MB
~506K SLoC