首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ftrace不能跟踪某些内核函数。

ftrace不能跟踪某些内核函数。
EN

Stack Overflow用户
提问于 2022-05-12 07:27:51
回答 1查看 176关注 0票数 0

我使用ftrace在5.4.20内核中跟踪ip_local_out()。

我确信ip_local_out()可以跟踪:

代码语言:javascript
复制
/sys/kernel/debug/tracing # cat available_filter_functions |grep ip_local_out
__ip_local_out
ip_local_out

因此,我设置了ftrace,并开始跟踪如下:

代码语言:javascript
复制
/sys/kernel/debug/tracing # echo ip_local_out > set_graph_function 
/sys/kernel/debug/tracing # echo function_graph > current_tracer 
/sys/kernel/debug/tracing # echo 3 > max_graph_depth 
/sys/kernel/debug/tracing # cat trace_pipe 

然后,我将这个内核与ICMP ping通信。但是,ftrace没有输出。

我怀疑ip_local_out()根本没有被调用,所以我在ip_local_out()中添加printk()并重新编译:

代码语言:javascript
复制
int ip_local_out(struct net *net, struct sock *sk, struct sk_buff *skb)
{
        int err;

        //crezov debug
        printk("<%s:%d> crezov debug: ip_local_out() is called!\n", __FUNCTION__, __LINE__);
        err = __ip_local_out(net, sk, skb);
        if (likely(err == 1))
                err = dst_output(net, sk, skb);

        return err;
}
EXPORT_SYMBOL_GPL(ip_local_out);

使用相同的配置和相同的ICMP ping,重新编译的内核可以输出为follws,这表明调用了ip_local_out(),此外,还可以跟踪ip_local_out!

代码语言:javascript
复制
[   43.219817] <ip_local_out:127> crezov debug: ip_local_out() is called!
 0)               |  ip_local_out() {
 0)   ==========> |
 0)               |    smp_irq_work_interrupt() {
 0) + 44.167 us   |      irq_enter();
 0) + 98.824 us   |      __wake_up();
 0) + 11.717 us   |      irq_exit();
 0) ! 567.096 us  |    }
 0)   <========== |
 0)               |    printk() {
 0) # 9894.629 us |      vprintk_func();
 0) # 9941.234 us |    }
 0)               |    __ip_local_out() {
 0) + 52.389 us   |      ip_send_check();
 0) ! 135.433 us  |    }
 0)               |    ip_output() {
 0) ! 649.046 us  |      ip_finish_output();
 0) ! 716.535 us  |    }
 0) * 12446.31 us |  }

但是,一旦我从ip_local_out中删除printk()并重新编译,就无法再次跟踪ip_local_out()。

我遗漏了什么?请帮帮忙。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-16 08:59:49

经过一周的实验,我终于找到了原因: ip_local_out()是自动内联的!当我像这样使用noinline属性时:

代码语言:javascript
复制
noinline int ip_local_out(struct net *net, struct sock *sk, struct sk_buff *skb)
{
        int err;

        err = __ip_local_out(net, sk, skb);
        if (likely(err == 1))
                err = dst_output(net, sk, skb);

        return err;
}
EXPORT_SYMBOL_GPL(ip_local_out);

ftrace可以捕获ip_local_out()。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72211606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档