Red Hat Training

A Red Hat training course is available for RHEL 8

5.5.12. 编译器和开发工具

GCC confuse SystemTap 生成的复合功能

GCC 优化可以为其他函数的部分内嵌副本生成复合函数。SystemTap 和 GDB 等工具无法区分这些复合函数和实际功能。因此,SystemTap 可以在复合和真实功能入口点上放置探测,从而为单个实际函数调用注册多个探测命中。

要临时解决这个问题,SystemTap 脚本必须经过相应调整,如检测递归和抑制与内联部分功能相关的探测。例如,一个脚本

probe kernel.function("can_nice").call { }

可以尝试避免描述的问题,如下所示:

global in_can_nice%

probe kernel.function("can_nice").call {
  in_can_nice[tid()] ++;
  if (in_can_nice[tid()] > 1) { next }
  /* code for real probe handler */
}

probe kernel.function("can_nice").return {
  in_can_nice[tid()] --;
}

请注意,这个示例脚本没有考虑所有可能的情况,如错过的 kprobes 或 kretprobes 或真正的预期递归。

(BZ#1169184)

ltrace 工具不报告函数调用

由于改进了应用于所有 RHEL 组件的二进制强化,ltrace 工具 无法再检测 RHEL 组件的二进制文件中的功能调用。因此,lt race 输出 为空,因为它不会报告在此类二进制文件上使用任何检测到的调用。目前还没有可用的临时解决方案。

请注意,lt race 可以 正确地报告构建的自定义二进制文件中的调用,而不使用相应的强化标志。

(BZ#1618748, BZ#1655368)