如何使Linux内核函数可用于ftrace function_graph跟踪器?

12

我希望使用ftrace function_graph 跟踪内核引导过程中的一个函数,以了解它的功能,但是该函数在available_filter_functions中不可用。

我尝试使用EXPORT_SYMBOL()导出该函数,猜测这样会使其可用,但事实并非如此。

你有解决方法吗?

值得注意的是,我想跟踪的函数是Android内核3.4中的persistent_ram_init_ringbufferpersistent_ram_early_init

我已经阅读了文档,但没有找到关于此的说明,grep命令也没有帮助...

谢谢


根据我对Ftrace的理解,函数的动态跟踪依赖于每个内核函数开头的mcount函数调用。如果您感兴趣的函数没有这个调用,可能不会显示可用的过滤器。您是否考虑过不使用动态跟踪?这可能会产生更好的结果。 - Matt Joyce
1
EXPORT_SYMBOL 似乎与内核模块加载器解决 GPL/非 GPL 许可问题更相关,而不是 Ftrace。 - bazza
1
当您列出available_filter_functions时,是否有任何内容被列出?据我所知,当您使用CONFIG_FUNCTION_TRACER(以及所有其他ftrace gubbins)编译内核并打开内核函数入口/退出跟踪时,通过在gcc命令行上设置选项来实现。这些选项会导致gcc为其编译的每个函数发出特定的函数调用。如果我理解正确,那么这意味着任何Linux内核函数都应自动被ftrace捕获。这使我想知道您的内核中当前是否有任何可追踪的内容。 - bazza
2个回答

8
问题在于这些函数被注释为__init和__devinit,这些标记被ftrace函数跟踪器列为黑名单。
为什么呢?因为作为模块初始化函数(或内核初始化函数),它们在初始化时加载并在完成初始化时被移除。每个ftrace跟踪的函数都保存在一个特殊的紧凑表中。目前还没有办法告诉ftrace这些函数已被移除(释放),并且ftrace应该将它们从其表中删除。如果我们忽略这一点,那么当启用函数跟踪时,ftrace将尝试修改不存在的位置,可能会导致各种问题(记得e1000e bug吗?)。
如果你真的想追踪它们,那么请删除这些注释。然后它们应该出现在要跟踪的函数列表中。

谢谢您的回答。我知道notrace,但不知道__init__devinit的范围。 - Jeremy Rocher
1
哇……很高兴在这里见到你,Steven Rostedt。你绝对是 Linux 内核中 ftrace API 的原始作者之一。 - Peter Teoh
我也无法追踪sched_wakeup,即使它明显不包含__init或__devinit标志。 - Claudio
在内核4.16.4上,这似乎不再是一个问题。 - codexplorer

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接