15.2. 使用 Dyninst
15.2.1. 使用带有 SystemTap 的 Dyninst 复制链接链接已复制到粘贴板!
要将 Dyninst 与 SystemTap 结合使用,允许非root
用户检测用户空间可执行文件,使用 --dyninst
(或 --runtime=dyninst
)命令行选项运行 stap
命令。这会告知 stap
将 SystemTap 脚本转换为使用 Dyninst 库的 C 代码,将这个 C 代码编译到共享库,然后加载共享库并运行脚本。请注意,当执行类似此操作时,stap
命令还需要指定 -c
或 -x
命令行选项。
使用 Dyninst 运行时检测可执行文件:
scl enable devtoolset-11 "stap --dyninst -c 'command' option... argument..."
$ scl enable devtoolset-11 "stap --dyninst -c 'command' option... argument..."scl enable devtoolset-11 "stap --dyninst -c 'command' option... argument..."scl enable devtoolset-11 "stap --dyninst -c 'command' option... argument..."scl enable devtoolset-11 "stap --dyninst -c 'command' option... argument..."scl enable devtoolset-11 "stap --dyninst -c 'command' option... argument..."scl enable devtoolset-11 "stap --dyninst -c 'command' option... argument..."scl enable devtoolset-11 "stap --dyninst -c 'command' option... argument..."
同样,使用 Dyninst 运行时检测用户的进程:
scl enable devtoolset-11 "stap --dyninst -x process_id option... argument..."
$ scl enable devtoolset-11 "stap --dyninst -x process_id option... argument..."scl enable devtoolset-11 "stap --dyninst -x process_id option... argument..."scl enable devtoolset-11 "stap --dyninst -x process_id option... argument..."scl enable devtoolset-11 "stap --dyninst -x process_id option... argument..."scl enable devtoolset-11 "stap --dyninst -x process_id option... argument..."scl enable devtoolset-11 "stap --dyninst -x process_id option... argument..."scl enable devtoolset-11 "stap --dyninst -x process_id option... argument..."
有关 Red Hat Developer Toolset 版本的信息,请参阅 第 12 章 SystemTap 。有关 SystemTap 及其用法的常规介绍,请参见 Red Hat Enterprise Linux 7 的 SystemTap 入门指南。
例 15.1. 使用带有 SystemTap 的 Dyninst
考虑一个名为 exercise.C
的源文件,其内容如下:
这个程序提示用户输入起始数字,然后计入 1,针对每个迭代调用 print_iteration()
函数,以便将数字打印到标准输出。使用 Red Hat Developer Toolset 中的 g++
编译器在命令行中编译该程序:
scl enable devtoolset-11 'g++ -g -o exercise exercise.C'
$ scl enable devtoolset-11 'g++ -g -o exercise exercise.C'
现在,考虑另一个名为 count.stp
的源文件,其内容如下:
此 SystemTap 脚本在执行进程的过程中打印调用 print_iteration()
函数的次数。在 练习
二进制文件中运行此脚本: