1

我正在尝试从 Systemtap 运行标准示例脚本之一。procmod_watcher.stp 使用 kprobes 来监视 fork、exec 等。但是当我尝试运行此脚本时出现错误。

semantic error: while resolving probe point: identifier 'kprobe' at /usr/share/systemtap/tapset/linux/nd_syscalls.stp:967:27
    source: probe nd_syscall.execve = kprobe.function("do_execve")

果然:stap -L 'kprobe.function("do_execve")'什么都不返回。怎么会这样?

我正在使用 Ubuntu,已按照以下说明进行操作: Ubuntu @sourceware 上的 Systemtap

我还尝试编译我自己的内核并确保通过配置启用 Kprobes、debug_info 和所有其他必需项。我犯了同样的错误。

我已经在 Fedora 上尝试过相同的脚本,它几乎是开箱即用的。但是我只有一个开启了fedora的虚拟机,并且想继续使用ubuntu一段时间。

我需要做什么才能在 ubuntu 的 systemtap 中启用 kprobes?

4

2 回答 2

3

kprobe.function探针依靠 systemtap 读取函数列表的文件System.map。跑

stap -vv -L 'kprobe.function("do_execve")'

查看 stap 在哪里寻找该文件;它可能在抱怨“内核符号表......不可用”。安排在System.map那里放置一个符号链接,然后 stap 应该找到它以及其中的do_execve功能。我们可以扩展 stap 的搜索路径,在其原始位置找到文件;欢迎指点。或者如果问题是权限,

sudo chmod a+r /boot/System.map*

这是为了解决https://wiki.ubuntu.com/Security/Features的误导部分- 另请参阅https://sourceware.org/bugzilla/show_bug.cgi?id=15172

于 2014-04-22T14:29:49.090 回答
1

添加到@fche 答案,SystemTap 正在寻找 System.map in /lib/modules/$(uname -r)/build/System.map

在 Ubuntu 中,system.map 是/boot/System.map-$(uname -r) 这样放置的:

  1. 您需要以 sudo 身份运行 stap(因为只有 root 可以访问 /boot 或执行某些组魔法)
  2. 创建到 System.map 的软链接:sudo ln -s /boot/System.map-$(uname -r) /lib/modules/$(uname -r)/build/System.map

我不建议更改任何位置、安全性和所有文件中的读取标志...

于 2017-02-02T10:00:30.443 回答