【问题标题】:How to make a linux kernel function available to ftrace function_graph tracer?如何使 ftrace function_graph 跟踪器可以使用 linux 内核函数?
【发布时间】:2013-02-22 16:08:38
【问题描述】:

我想在内核启动过程中使用 ftrace function_graph 跟踪一个函数以了解它的作用,但它在 available_filter_functions 中不可用。

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

你有解决办法吗?

有关信息,我要跟踪的函数是 Android 内核 3.4 中的 persistent_ram_init_ringbufferpersistent_ram_early_init

我通读了文档,但对此一无所获,而 grep 并没有提供更多帮助...

谢谢

【问题讨论】:

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

标签: android linux kernel ftrace


【解决方案1】:

问题是这些函数被 __init 和 __devinit 注释,被 ftrace 函数跟踪器列入黑名单。

为什么?因为作为模块初始化函数(或内核初始化函数),它们在初始化期间被加载并在初始化完成时被移除。 ftrace 跟踪的每个函数都保存在一个特殊的紧凑表中。目前,没有办法告诉 ftrace 这些函数已被删除(释放)并且 ftrace 应该将它们从其表中删除。如果我们忽略这一点,那么当启用函数跟踪时,ftrace 将尝试修改不再存在的位置并可能导致各种问题(还记得 e1000e 错误吗?)。

如果您真的想跟踪它们,请删除这些注释。然后它们应该出现在要跟踪的函数列表中。

【讨论】:

  • 感谢您的回答。我知道notrace,但不知道__init__devinit 的范围。
  • 哇......很高兴在这里见到你,Steven Rostedt。您绝对是 linux 内核中 ftrace API 的原作者之一。
  • 我也无法追踪 sched_wakeup,即使它显然不包含 __init 或 __devinit 标志。
  • 在内核 4.16.4 上,这似乎不再是问题了。
【解决方案2】:

http://lwn.net/Articles/370423/

http://www.mjmwired.net/kernel/Documentation/trace/ftrace.txt

这些链接可能会有所帮助。首先是我通过谷歌搜索发现的东西。其次是 ftrace 文档

【讨论】:

    猜你喜欢
    • 2014-08-01
    • 1970-01-01
    • 2022-08-24
    • 2017-06-11
    • 2016-10-26
    • 2023-01-22
    • 2018-01-18
    • 1970-01-01
    • 2016-01-10
    相关资源
    最近更新 更多