• 正文
  • 相关推荐
申请入驻 产业图谱

内核调试AI工作流:ftrace / perf / kdump 怎么让AI帮上忙

05/29 11:29
701
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

我以前认为内核调试是 AI 最难帮上忙的领域——这种活儿太"野",每个 bug 都是孤例,套路化程度低。

直到 64ms 抖动事件彻底改变了我的看法。简单说:i.MX 8M Plus 上一个音频项目,应用层每隔 60-90ms 就丢包一次。我们排查了一周,最后是把 ftrace 输出(30 万行)+ perf top 数据 + dmesg 一起喂给 Claude,它 5 分钟指出根因是 CPU0 的 RT 进程 starve 了 watchdog softirq

那次之后我系统地调整了内核调试的工作流。今天讲怎么让 AI 真正参与到 ftrace / perf / kdump 这些重量级调试工具中。

预警:本文假设你已经会用 ftrace / perf / kdump。如果你还不会,先看内核 trace docs。

一、为什么内核调试是 AI 加速的好场景

之前有一段时间我也以为 AI 不行——因为内核调试看起来太"靠经验"。后来发现是我没找到正确的姿势。AI 在内核调试上的强项:

1. 处理大量结构化数据

ftrace 一个 trace.dat 几百 MB、几百万行——人不可能逐行看。AI 能在几秒内做模式识别。

2. 跨工具关联

ftrace + perf + dmesg 三份数据放一起看,关联出"同一时刻 A 在做什么 + B 在做什么"。这种事人做累,AI 做轻松。

3. 知识检索

"这个 OOPS 在 mainline 5.15 是 commit xxx 修复的"——AI(特别是有 web search 的)查得比 Google 准。

4. 假设排序

"这种 symptom 可能的原因有 5 种,按概率排序"——这类"可能性枚举"是 AI 的强项。

5. 输出格式化

把 ftrace 数据做成时序图、热力图——AI 写 matplotlib / plotly 比你快 10 倍。

AI 不擅长的

    精确的硬件信号分析(必须示波器)跨硬件 + 软件 + 物理环境的诊断真正的"灵感跳跃"("会不会是 cache 问题"——这种猜测人比 AI 强)

结论:AI 当你的 trace 数据分析师 + 知识检索助手,决策权在你

二、整体工作流

1. 现象描述         ← 你
2. 数据采集         ← 你 + AI 帮选 trace points
3. 数据预处理        ← AI(脚本生成)
4. 假设生成 + 排序   ← AI(基于数据 + 知识)
5. 验证假设         ← 你(可能要再采集)
6. 根因确认         ← 你
7. 修复方案         ← 你 + AI 配合

下面分别展开。

三、Step 1-2:现象描述 + 选 trace points

让 AI 帮你设计 trace 策略

Prompt 模板

现象:
- 平台:i.MX 8M Plus,4 核 A53 @ 1.6GHz,Linux 5.15.71 + RT patch
- 应用:4 路音频采集(48kHz / 24bit / 双声道),通过 ALSA 拿数据
- 问题:每 60-90ms 丢包一次,每次丢 1-2ms 数据
- 复现:稳定可复现,但只在系统加载时(CPU 占用 ~70%)发生
- 已尝试:CPU isolation 没用、把进程绑到 CPU3 也没用

我想用 ftrace 抓数据。请告诉我:
1. 应该开哪些 events / tracers
2. buffer size 怎么设
3. 怎么 trigger(手动 / 触发器 / 脚本)
4. 大约能抓多大数据量、需要分析哪几个维度

AI 一般会给出:

建议开启:
- function_graph tracer,filter 调度相关函数
- events: sched_switch, sched_wakeup, irq_handler_entry/exit, softirq_entry/exit
- events: workqueue_*(看是否是 wq starve)
- events: hrtimer_*
- 可选:trace_printk in 你的音频驱动

trigger:用 trace-cmd record -e ... -p function_graph -l <funcs>,跑 5 秒采集大约 200-500MB

分析维度:
1. 每个丢包时刻前 100ms,CPU3 上发生了什么
2. softirq 是否被高优先级任务挤掉
3. 中断关闭最长持续时间
4. preempt off 区间分布

我以前自己想 trace 策略可能漏掉一半。AI 的覆盖度更全。

自动生成 trace-cmd 命令

基于上面的策略,给我可直接运行的 trace-cmd 命令。
要求:
- 每个 trace session 5 秒
- 保存到 /tmp/trace-${TIMESTAMP}.dat
- buffer per CPU 100MB
- 触发条件:用户态 trigger(写 /sys/kernel/tracing/trace_marker)

输出:

sudo trace-cmd record 
  -e sched_switch -e sched_wakeup 
  -e irq_handler_entry -e irq_handler_exit 
  -e softirq_entry -e softirq_exit 
  -e workqueue_execute_start -e workqueue_execute_end 
  -e hrtimer_expire_entry -e hrtimer_expire_exit 
  -p function_graph 
  -l 'schedule,__schedule,wake_up_process,*_irqsave,*_irqrestore' 
  -B audio -b 102400 
  -o /tmp/trace-$(date +%s).dat 
  sleep 5

复制粘贴就能跑——这种"我懂但要查文档"的命令,AI 一秒给到位。

四、Step 3:数据预处理

ftrace 原始 dat 文件 AI 不能直接看(二进制)。要先 trace-cmd report 转文本,再做处理。

让 AI 写预处理脚本

trace-cmd report 输出的格式如下:

       tasks-1234  [003] d.h2  1234.567890: sched_switch: prev_comm=tasks ...
       
请写 Python 脚本:
1. 解析每行:timestamp / cpu / pid / event / params
2. 对每个 sched_switch,计算 task 在 CPU 上运行了多久
3. 找出"runtime > 5ms" 的任务(候选 hog)
4. 找出"runtime > 1ms 且优先级 > 50" 的任务(潜在 RT hog)
5. 找出 IRQ disable > 100us 的区间
6. 找出 preempt disable > 100us 的区间
7. 输出 JSON,按时间分桶(每 10ms 一桶)

AI 写的脚本一般 100-200 行,跑 1GB ftrace 数据约 1-2 分钟。比我自己写至少省 4 小时

预处理后的数据形态

{
  "buckets": [
    {
      "t_start": 1234.560,
      "t_end": 1234.570,
      "cpu0": {"top_tasks": [{"comm": "audio-rt", "ms": 8.2}], "irq_off_max_us": 230},
      "cpu3": {"top_tasks": [{"comm": "kworker/3:1H", "ms": 4.5}], "irq_off_max_us": 45},
      ...
    }
  ]
}

这种结构化数据 AI 处理起来轻松——比让它分析原始 trace 快 10 倍、准确率高 5 倍。

五、Step 4:假设生成 + 排序

这是 AI 最强的环节。

Prompt

分析这份 ftrace 预处理数据:

<贴 JSON>

业务现象:每 60-90ms 出现一次音频丢包。

请做:
1. 找出与丢包时刻强相关的内核活动(前 5ms 时间窗)
2. 列出 5 个最可能的根因,按可能性排序
3. 每个根因给出"如果是这个,下一步怎么验证"
4. 不确定的地方明确说明"需要更多数据"

AI 输出大致:

强相关活动:
- 每次丢包前 2-3ms,CPU0 上 sshd 进程运行了 8-12ms(被 SCHED_FIFO 优先级 51 的 audio-rt 抢占了,但 audio-rt 自己也跑了 3ms)
- CPU3 在丢包时刻 IRQ 被关闭了 280us(来自 i2c_imx 驱动的 transfer 函数)

可能根因(按概率):

1. [60%] CPU0 上 sshd 阻塞了 ksoftirqd/0,network softirq 堆积导致 SDMA 中断处理延迟
   验证:抓 softirq 在 sshd 运行期间是否累积、ksoftirqd/0 的 wakeup 时间

2. [20%] i2c_imx 的 mutex / IRQ disable 时间过长
   验证:开 lockdep / lock_stat,看 i2c_imx 的临界区时长分布

3. [10%] hrtimer 调度抖动
   验证:trace_printk 在音频中断 ISR,看 ISR 触发的 jitter

4. [5%] memory pressure
   验证:开 mem_pressure tracer

5. [5%] 其他(cache thrash / DDR 时序)
   验证:perf top 看 cache miss 率

按 1 验证后果然是这个原因——sshd 跑 telemetry 时占满 CPU0,softirq 没机会跑。把 sshd cgroup 限制 CPU 后丢包消失。

5 分钟出根因。我们之前花了一周。

六、perf 数据分析

跟 ftrace 类似,但侧重不同。perf 适合:

    CPU 热点函数cache miss / branch missIPC(instructions per cycle)PMU 事件

让 AI 解读 perf report

perf record -g --call-graph dwarf -F 999 -p $PID sleep 30
perf report --stdio > perf.txt

把 perf.txt(前 500 行)丢给 AI:

这是一个音频处理进程的 perf report:
<贴前 500 行>

业务背景:进程做 4 路音频实时混音,CPU 占用率 80%。我希望降到 60% 以下。

请:
1. 找出热点函数
2. 哪些热点是"正常"的(业务必须)
3. 哪些热点可能是"代码效率问题"
4. 给出优化方向(不要给具体代码,只给方向)

AI 输出会指出:

热点 #1: alsa_lib_pcm_writei (45%) — 这是 ALSA write,正常

热点 #2: __memmove_neon (18%) — neon 加速的 memmove,但调用太频繁。检查是否有不必要的 buffer copy(zero-copy 优化空间)

热点 #3: pthread_mutex_lock (8%) — 锁竞争。看看 lock 粒度能否降低

热点 #4: clock_gettime (5%) — 调用过多。考虑缓存时间戳

每条都给方向,不给代码。给方向就够了——具体优化要工程师上手做。

火焰图

让 AI 写脚本生成火焰图:

基于上面的 perf 数据生成火焰图(用 brendangregg 的 FlameGraph)。
脚本:从 perf.data 一键生成 SVG。

AI 给出:

perf script | ./stackcollapse-perf.pl | ./flamegraph.pl > flame.svg

我手动改了 stack collapse 的参数。5 分钟出图

七、kdump 分析

最难的活儿——内核挂了,要从 vmcore 里找原因。

基础环境

# 配置 kdump
sudo apt install kdump-tools crash
echo "crashkernel=128M" | sudo tee -a /etc/default/grub
update-grub && reboot

Crash 结合 AI

crash 命令进交互模式后,把关键输出复制给 AI:

crash> bt
PID: 1234   TASK: ffff800012345678  CPU: 2   COMMAND: "audio-rt"
#0 [...]  panic
#1 [...]  oops_end
#2 [...]  __die
 ...
#8 [...]  iio_read_channel_raw

crash> log | tail -50
[...]
[12345.678] BUG: kernel NULL pointer dereference, address: 0000000000000018
[...]

crash> dis -l <RIP>
0xffff800012345abc <iio_read_channel_raw+0x14>: ldr x1, [x0, #24]

把这些丢给 AI:

我在分析一个 NULL deref kernel panic:

【backtrace】
<贴 bt>

【dmesg】
<贴 log>

【panic 处汇编】
<贴 dis 输出>

【源码上下文】
<贴 iio_read_channel_raw 函数>

请:
1. 哪个变量是 NULL
2. 这个变量为什么会是 NULL(设备未 probe / 已 release / race)
3. 列出 3 个最可能的代码 bug
4. 给出修复方向

AI 一般能猜中 80%。剩下 20% 它会承认"信息不够,建议提供 X"。

重要:vmcore 不能整个传给 AI

vmcore 几百 MB 全给 AI 没意义。你要做的是把 crash 命令的关键输出(bt / log / ps / mod / kmem -i 等)选择性给 AI。

八、几个真实案例

案例 1:音频丢包 64ms

工具:ftrace + 我们的预处理脚本 + Claude

时长:5 分钟(vs 之前 1 周)

根因:sshd telemetry 阻塞 ksoftirqd

修复:cgroup 限制 sshd CPU + IRQ affinity 调整

案例 2:rcu_sched stall

工具:dmesg 关键 stack + AI 检索

我看到:

rcu: INFO: rcu_sched self-detected stall on CPU
[...]  pwrite64+0x1c
[...]  i2c_smbus_xfer

丢给 AI:"这个 stall pattern 你见过吗?"

AI 答:

这是经典的 i2c bus stuck on long transaction。i2c-imx 在 5.15 内核有个 known issue(commit xxxxxxx 修复),影响是当 slave NAK 时 driver 不正确地 retry,导致整个事务持续几秒。建议 backport。

cherry-pick 那个 commit 后再没遇到。AI 帮我省了至少两天的 git log 翻找

案例 3:Memory leak(slab)

工具:/proc/slabinfo 长时间采样 + AI 趋势分析

# 每分钟采一次
while true; do
  cat /proc/slabinfo > /tmp/slab-$(date +%s).txt
  sleep 60
done

跑 24 小时,把 1440 份数据合并成 csv 给 AI:

分析过去 24 小时 slabinfo 趋势,找出持续增长的 slab:
<贴 csv>

每个 slab 给:
- 总增长率(KB/h)
- 是否线性增长(leak 特征)
- 这个 slab 通常被哪些代码使用
- leak 嫌疑等级

AI 锁定 vm_area_struct 持续涨——是某个用户态进程 mmap leak。用 eu-stack -p $PID 抓栈定位到具体代码。

九、经验

1. AI 给的"看起来正确"的分析必须验证

AI 经常会说:"X 是根因,因为 Y 数据显示 Z"。Z 经常是 AI 编的——它没真的在数据里看到。

修复方式:要求 AI 给出"具体证据"——哪个时间戳、哪个 CPU、哪个函数。然后你回去 grep 一下数据看真的有没有

我有过 3 次踩坑:AI 言之凿凿说"sched_switch 显示 X",我回去 grep 发现根本没这个 event。

2. 不要让 AI 直接看 raw trace

不要把 100MB 的 trace.txt 整个塞给 AI——它读不完,会"假装读完"然后 hallucinate。

正确:先用脚本预处理,把数据降维到几 KB 的 JSON,再给 AI。

3. 优先级:dmesg > trace > perf > kdump

排查顺序:

dmesg 关键字检索(OOPS / BUG / WARN)—— 30 秒

ftrace 关键 events(sched / irq)—— 5 分钟采集 + 5 分钟分析

perf 热点(性能问题才需要)

kdump(必须的最后手段)

AI 在每一步都帮得上忙,但越往下投入越大。先做轻的。

4. trace 数据和源码一起给

只给 trace 数据,AI 只能猜行为。同时给相关源码 + DT + Kconfig,AI 能给具体的代码层根因。

5. 内核 mailing list 是 AI 的好朋友

很多 bug 在 lkml 已有讨论。AI 检索 lkml + 内核 git log 比你 Google 强。要充分利用。

十、什么调试场景不该用 AI

硬件信号问题电平 / 时序 / 噪声)—— 必须示波器

物理布线问题(焊点虚焊 / 接触不良)

多机分布式 race condition —— AI 看不全

跨 hypervisor 的虚拟化 bug —— 太罕见,AI 知识盲区

Secure World / TrustZone 问题 —— ARM TF-A / OP-TEE 的 bug 极少见,AI 知识不够

这些场景 AI 给的建议大概率是错的,要警惕。

十一、ROI 排序

高 ROI

dmesg / OOPS / BUG 关键字 + AI 检索 lkml  —— 即时见效

ftrace 数据预处理脚本(让 AI 写) —— 一次写好长期用

AI 假设排序(基于预处理数据) —— 复杂 bug 加速 5-10 倍

中 ROI

perf 热点优化建议slabinfo / meminfo 长时间趋势分析kdump backtrace + AI 推理

低 ROI

AI 直接读 raw trace(hallucination 风险大)

AI 写内核驱动 patch fix(没 review 不能信)

完全替代你的内核知识(永远做不到)

十二、写在最后

内核调试是嵌入式工程师的核心壁垒。AI 不会让这个壁垒消失,但会让你的产能翻几倍

最关键的认知转变:AI 不是替你调试,是让你成为"超级 trace 分析师"——它处理你处理不完的数据量、检索你检索不完的知识库、提出你来不及枚举的假设。

而最终的"啊,我懂了"那一刻,依然只能发生在你脑子里。

如果你目前调试只看 dmesg,从今天起把 ftrace 用起来——它和 AI 的组合是嵌入式工程师 2026 年最值得投资的技能组合。

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录

研究生在读,熟悉硬件、STM32单片机、嵌入式Linux。已收获小米、联发科、浙江大华、上能电气、英威腾、汇川技术、格力、富士康等大厂offer。在这里分享求职经验、嵌入式学习规划、考研、嵌入式Linux技术文章等。