惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
N
Netflix TechBlog - Medium
宝玉的分享
宝玉的分享
Google DeepMind News
Google DeepMind News
腾讯CDC
G
Google Developers Blog
Martin Fowler
Martin Fowler
Microsoft Security Blog
Microsoft Security Blog
Recent Announcements
Recent Announcements
爱范儿
爱范儿
Engineering at Meta
Engineering at Meta
Microsoft Azure Blog
Microsoft Azure Blog
A
About on SuperTechFans
aimingoo的专栏
aimingoo的专栏
有赞技术团队
有赞技术团队
Jina AI
Jina AI
人人都是产品经理
人人都是产品经理
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
M
MIT News - Artificial intelligence
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
美团技术团队
WordPress大学
WordPress大学
阮一峰的网络日志
阮一峰的网络日志

博客园 - dolinux

在ubuntu22上编译perfbook 内核技术问答:scoped_guard(rcu)与guard(rcu)的区别 内核技术问答:rcu_boost技术以及CPU静止状态与任务静止状态的区别 内核技术问答:内核调度器中有没有识别交互式应用和非交互式应用的算法? 内核技术问答:sysctl_sched_min_granularity 与 sysctl_sched_wakeup_granularity 跟CPU数量是什么关系? 内核技术问答:sysctl_sched_wakeup_granularity与sysctl_sched_min_granularity冲突吗? 内核技术问答:传统CFS调度器是如何惩罚fork出来的进程的? 内核技术问答:传统CFS调度器中wakeup_preempt_entity的实现中为什么不给wakeup_gran传入current的se呢? 内核技术问答:传统的CFS调度器对一个线程的时间片是如何规定的? 借助AI知识库学习内核 如何在Win10下阅读Linux内核代码? Linux Master 知识库 —— 致 Linux 系统工程师 利用AI生成批量导出内核源码的脚本 利用AI生成批量下载LWN上的技术文章的脚本 利用AI生成批量导出内核patch的脚本 通过Synergy共享鼠标的前进和后退键 vscode + clangd 配置代码阅读环境 使用HugeTLB验证基于Contiguous Bit的大页 ubuntu20.04安装Synergy
ftrace可视化工具迎来重大升级
dolinux · 2026-01-09 · via 博客园 - dolinux

sample

今天对ftrace可视化工具进行了重大改造,提升了代码定位的准确性,此外处理性能也得到指数级的提高。

首先是提高了代码定位的准确性。做这个工具的初衷就是希望让全球广大Linux内核爱好者在看trace时可以很容易定位当前函数具体是在代码的哪一行调用的,这对于梳理代码执行流程至关重要。而funcgraph-retaddr输出的是函数的返回地址,直接对这个地址调用addr2line显然不满足我们的要求。根据函数调用的原理,在执行函数调用指令时,CPU会自动保存下一条指令的地址,因此解决方案也非常简单粗暴,直接对返回地址减去一定数值得到前一条指令的起始地址,可是具体减多少呢?对于ARM64架构,每条指令固定占4字节,所以减4可以。但是对于像x86架构这种变长指令集,就不好确定了。我的AI知识库说addr2line不需要精确的指令起始地址,只需落在某行代码对应的指令范围内即可正确映射,这个工具的设计初衷就是处理近似地址(如Oops中的函数+偏移),为的是方便调试。所以统一减1就可以保证得到的地址落在前一条指令的范围内(DWARF规范也是这么推荐的),再调用addr2line就可以得到当前函数被调用的准确位置。

然后就是大幅提高了解析trace文件的性能。目前根据地址解析得到代码行调用的是内核的faddr2line工具,它是用bash脚本语言编写的,执行的时候调用了很多三方的工具,比如readelf、grep以及awk等,同时它内部使用了多个循环遍历的算法(O(N)),对于处理像vmlinux这种包含几十万个函数符号的ELF文件来说就非常不合适。所以用python语言对这个工具进行了重写,不再调用三方的工具(仅保留addr2line),同时引入了多个二分搜索算法(O(LogN)),使文件的处理性能得到指数级的提高。以处理一个40行的trace文件为例,如果使用传统的faddr2line的话,需要大约54秒,而重写后仅需6秒。处理1000行trace日志,耗时也只有7秒,大部分时间(5秒多)都消耗在启动时解析vmlinux,构建内部数据结构上了。

虽然全程都是让AI编码,但需要自己对整个流程有一个清晰的理解,然后给AI提出需求,AI写完后还需要人工走读,发现待优化的点,让AI继续优化,前后折腾了有将近30版。

目前我在gitee上给这个工具建立了一个仓库,方便后续继续完善,项目地址是:https://gitee.com/pengdonglin137/FuncGraph