7.8. 编译器和开发工具 (机器翻译版本)

GCC生成的综合函数会混淆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组件的二进制文件中的函数调用。作为结果, ltrace 输出为空,因为在此类二进制文件上使用时,它不会报告任何检测到的调用。目前没有可用的解决方法。

作为一个说明, ltrace 可以正确地报告在没有相应强化标志的情况下构建的自定义二进制文

(BZ#1618748, BZ#1655368)


为了尽快向用户提供最新的信息,本文档可能会包括由机器自动从英文原文翻译的内容。如需更多信息,请参阅此说明。