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

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 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调度器对一个线程的时间片是如何规定的? - dolinux 借助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