Debugging the kernel using Ftrace - part 1 [LWN.net]
Debugging the kernel using Ftrace - part 2 [LWN.net]
背景:
咱也新手学习一下,都是网上搜的,然后adb里操作一遍,博文偏向工具的操作与使用。
This first part will talk briefly about
1. setting up Ftrace,
2. using the function tracer,
3. writing to the Ftrace buffer from within the kernel,
4. and various ways to stop the tracer when a problem is detected.
----------------------------------------------------------------------------------------------------------------------
第一篇的一些翻译与概括:
Ftrace依赖debugfs, 文件接口位置/sys/kernel/debug/, 使用Ftrace前在kernel的config文件里打开以下宏开关:
CONFIG_FUNCTION_TRACER
CONFIG_FUNCTION_GRAPH_TRACER
CONFIG_STACK_TRACER
CONFIG_DYNAMIC_FTRACE
Ftrace最powerful的功能就是函数追踪。
配置了CONFIG_DYNAMIC_FTRACE 后,cat /sys/kernel/debug/tracing/current_tracer是NOP, 以保证系统以100%性能运行。
cat available_tracers 可以查看能够使用的tracer功能。使用功能就是用echo把功能写入current_tracer文件节点,如echo function_graph > /sys/kernel/debug/tracing/current_tracer.
然后说了以下trace_printk(),比较了printk和trace_printk().
1.printk是debug之王,但是在中断上下文,进程调度,网络中可能使系统性能降低或者出现锁。
2.printk是输出到控制台,trace_printk不会输出到控制台,而是输出到trace文件中(ring buffer),通过cat可以读取。
3.trace_printk只需0.1微妙,printk写到控制台可能需要几毫秒,trace_printk几乎不影响性能。
后面讲述了在adb中通过文件节点,打开trace和关闭trace,从文件系统里面的看就是:
trace_on;
执行或加载内核模块;
trace_off;
cat trace查看模块运行的函数调用。
-----------------------------------------------------------------------------------------------------
第二篇主要是说在内核里面用函数搞,抓取函数调用堆栈,查看内核崩溃原因。