如何可靠、透明地跟踪流程执行情况

如何可靠、透明地跟踪流程执行情况

在大多数(如果不是全部)软件包的编译过程中,stdout 和 stderr 上的输出是由多个单独的进程创建的,并且在构建过程中处理/更改/创建的文件也由多个不同的进程处理。这是因为(可能大多数)软件包的构建系统依赖于几个不同的软件来产生最终的构建结果。

如果可以透明地跟踪 Linux(或 BSD)下的构建过程,以便可以检索以下信息,那将非常有用:

  • 哪个进程在 stdout 和 stderr 上产生了哪些信息(以及该进程的祖先是什么)
  • 哪个进程读取了某个文件
  • 哪个进程正在写入某个文件

此信息将有助于:

  • 即使对于并行执行的构建也生成线性化构建日志
  • 可以自动将输入源文件与输出二进制文件关联起来
  • 检测嵌入的代码副本
  • 检查 GPL 合规性(因为我们现在知道哪些文件链接在一起)
  • 找出适用于创建的二进制文件的许可证(因为我们知道使用哪些源文件来生成它)

跟踪程序执行的另一种方法是修改每个生成或更改文件的程序,并使它们都具有统一的机器可读输出格式。考虑到软件编译涉及多少程序(不同语言的编译器、文档生成器、图像转换器甚至 sed、grep、cp 或 mv 等 Unix 命令),这是不可行的。

Linux 提供了几种方法来跟踪进程及其所有子进程进行的所有系统调用。但是基于 ptrace 或 LD_PRELOAD 的机制确实会以某种方式影响某些构建,使得它们要么失败,要么产生与未通过任一方法跟踪时不同的结果。 systemtap 通常会跳过探测,因为它只是被动地侦听,并且如果事件发生得太快则不会减慢进程。

因此,我正在寻找一种方法,以对进程及其所有子进程完全透明(除非它可能会影响执行时间)的方式可靠地跟踪进程及其所有子进程进行的系统调用。

这在 Linux(或 BSD)中可能吗?如果是,怎么办?

相关内容