获取内核模块进程号
printk(“info (pid=%d comm=%d)\n”, current->pid,current->comm);
开启ftrace跟踪特定函数 这里是 __alloc_pages_nodemask
#!/bin/sh
dir=/sys/kernel/debug/tracing
sysctl kernel.ftrace_enabled=1
echo nop > ${dir}/current_tracer
echo function_graph > ${dir}/current_tracer
echo __alloc_pages_nodemask > ${dir}/set_graph_function
echo 10 > ${dir}/max_graph_depth
echo 1 > ${dir}/tracing_on
sleep 1
#echo
read -p '按任意键exit' name
echo "finished"
echo 0 > ${dir}/tracing_on
cat ${dir}/trace > showtrace.txt
#echo nop > current_tracer;//清空tracer
#echo function_graph > current_tracer;//使用图形显示调用关系
#echo ip_rcv > set_graph_function;//设置过滤函数,可以设置多个
#echo 1 > tracing_enabled开始追踪
根据进程号过滤跟踪日志
------------------------------------------
0) insmod-14593 => dmesg-14595
------------------------------------------
0) | __alloc_pages_nodemask() {
0) | _cond_resched() {
0) 0.227 us | rcu_all_qs();
0) 0.634 us | }
0) | get_page_from_freelist() {
0) 0.157 us | __inc_numa_state();
0) 0.154 us | __inc_numa_state();
0) 1.800 us | }
0) 3.898 us | }
0) | __alloc_pages_nodemask() {
0) | _cond_resched() {
0) 0.153 us | rcu_all_qs();
0) 0.509 us | }
0) | get_page_from_freelist() {
0) 0.156 us | __inc_numa_state();
0) 0.154 us | __inc_numa_state();
0) 1.048 us | }
0) 2.092 us | }
小遗憾是不可能跟踪所有函数,但是很多函数可以跟踪到,有个函数列表,可以查看是否能跟踪命令如下:
cat available_filter_functions
本文介绍如何使用ftrace在Linux内核中跟踪特定函数,如__alloc_pages_nodemask,展示如何获取内核模块的进程号并进行深入的函数调用分析。通过设置ftrace参数,可以详细记录函数调用流程,为内核调试和性能优化提供有力工具。
791

被折叠的 条评论
为什么被折叠?



