高效分析Linux内核源码
最近在调试nvme的驱动 , 顺便分享一下分析内核代码的方法 , 我自己感觉异常高效 , 整体逻辑分分钟可以掌握的明明白白 。
对于给定的一个函数 , 例如nvme_probe()函数 , 如果想分析系统怎样调到这个函数,也就是想知道函数之前的调用栈 , 可以在函数中添加WARN_ON(1)打印堆栈 , 但是这样要重新编译源码 , 内核提供了ftrace 技术 , 可以使用ftrace function + 和enable func_stace_trace达到同样的效果 。
cd/sys/kernel/debug/tracing/echo nvme_probe > set_ftrace_filterecho 1 > ./options/func_stack_trace
如果nvme_probe()函数中包含trace_event的内嵌函数 , 那就更加方便了 , 可以使用:
cd/sys/kernel/debug/tracing/echo 1 > ./events/nvme/nvme_probe/enableecho 1 > ./options/stacktrace 或者 echo 'stacktrace' > ./events/nvme/nvme_probe/trigger
也可以设置内核启动参数:
trace_options=func_stack_trace,userstacktrace,sym-addr ftrace=function ftrace_filter="nvme_probe"
效果图:
文章插图
如果想知道nvme_probe()函数之后的调用逻辑 , 可以使用ftrace + func_graph的方式
debugfs=/sys/kernel/debugecho nop > $debugfs/tracing/current_tracerecho 0 > $debugfs/tracing/tracing_onecho 10 > $debugfs/tracing/max_graph_depth#echo $$ > $debugfs/tracing/set_ftrace_pidecho function_graph > $debugfs/tracing/current_tracerecho nvme_probe > $debugfs/tracing/set_graph_functionecho 1 > $debugfs/tracing/tracing_onexec "$@"
【高效分析Linux内核源码】同样也可以设置内核启动参数:
ftrace=function_graph ftrace_graph_filter="nvme_probe"
效果图:
文章插图
(图中白色背景的函数还可以再展开详细查看)
呈现上图的效果可以借助折叠脚本:function-graph-fold.vim
脚本来源:
使用方法:
vim ./ftrace-nvme/func-graph-nvme-probe.log -S ./function-graph-fold.vim
更详细的说明可以参考我的github:
- Linux培训完能到什么水平,之后还需要学习哪些技术?
- 如何使用 lshw 查看 Linux 设备信息
- 分析|用数据量化方法透视不确定性世界
- 数据|女生从事数据分析岗位会面临哪些压力
- 澳大利亚留学—大数据分析
- AMD Radeon图形驱动占到了Linux内核的10.5%
- SQL查询优化分析(900W+数据,从17s到300ms)
- R数据分析:如何计算问卷的聚合效度,实例操练
- 腾讯游戏开发工程师:Linux 机器 CPU 毛刺问题排查
- 收音机“开肠破肚”之电路分析2:根德S400/500/700