本文共 1561 字,大约阅读时间需要 5 分钟。
获取内核模块进程号
printk(“info (pid=%d comm=%d)\n”, current->pid,current->comm);开启ftrace跟踪特定函数 这里是 __alloc_pages_nodemask
#!/bin/shdir=/sys/kernel/debug/tracingsysctl kernel.ftrace_enabled=1echo nop > ${dir}/current_tracerecho function_graph > ${dir}/current_tracerecho __alloc_pages_nodemask > ${dir}/set_graph_functionecho 10 > ${dir}/max_graph_depthecho 1 > ${dir}/tracing_onsleep 1#echo read -p '按任意键exit' nameecho "finished"echo 0 > ${dir}/tracing_oncat ${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转载地址:http://ynjvb.baihongyu.com/