5.7.9. 编译器和开发工具
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)