内核重启后期调试:如何将ftrace输出至串口控制台?
内核关机后期阶段的ftrace追踪方案
一、强制ftrace输出到串口控制台
ftrace本身依赖内核printk子系统,只要内核配置了串口控制台,关机后期printk会自动切换到串口输出。按以下步骤配置:
- 确保内核编译时开启
CONFIG_SERIAL_CONSOLE和CONFIG_PRINTK,这是串口输出的基础。 - 开机后配置ftrace:
# 仅追踪目标函数 echo acpi_sleep_prepare > /sys/kernel/tracing/set_ftrace_filter # 启用函数追踪模式 echo function > /sys/kernel/tracing/current_tracer # 开启追踪开关 echo 1 > /sys/kernel/tracing/tracing_on # 可选:确保原子操作环境下也能输出日志 echo 1 > /sys/kernel/tracing/trace_options/printk-atomics - 内核启动参数添加
console=ttyS0,115200(替换成你的实际串口设备和波特率),强制系统全程保留串口控制台,避免关机后期被关闭。
二、ftrace失效时的替代方法
如果串口驱动在关机后期被卸载导致ftrace输出中断,试试这两种方案:
- 环形缓冲区事后分析:
ftrace的追踪数据存在内存环形缓冲区里,即使输出断了,数据仍会保留。提前开启内核的CONFIG_CRASH_DUMP和CONFIG_PROC_VMCORE,并设置:
防止缓冲区被释放。系统重启后用echo 1 > /sys/kernel/tracing/trace_options/disable_on_freecrash工具加载vmcore镜像,读取/sys/kernel/tracing/trace的内容即可获取追踪数据。 - 静态插桩直接输出:
直接修改内核源码,在acpi_sleep_prepare函数开头添加printk语句,输出你需要的参数或执行状态,重新编译内核。这种方法不依赖ftrace,printk在关机后期会优先走串口,可靠性更高。
内容的提问来源于stack exchange,提问作者George Shuklin
相关产品推荐
相关产品推荐

