如何将Linux内核跟踪信息输出至控制台(重启问题调试)
让tracefs跟踪信息直接输出到控制台的方案
针对你遇到的重启阶段无法导出trace文件的问题,确实可以通过配置内核参数和tracefs选项,让跟踪信息实时打印到控制台。以下是具体操作:
一、内核启动参数直接配置
直接在内核命令行添加以下参数,就能让function_graph等跟踪器的输出同步到控制台:
trace_printk:开启trace_printk输出到控制台的基础开关ftrace=function_graph:启用function_graph跟踪器(如果需要其他跟踪器,替换成function等即可)trace_options=printk:核心配置——让所有跟踪缓冲区的内容同时输出到控制台,而不是只存在/sys/kernel/tracing/trace文件里
你之前只加了tp_printk没用,是因为这个参数只针对tracepoint事件的输出,而function_graph属于ftrace跟踪器,必须靠trace_options=printk才能把它的输出导到控制台。
二、自定义跟踪范围的提前配置(可选)
如果需要只跟踪重启相关的函数(减少控制台输出噪音),可以在系统启动后预先配置tracefs,配置会在重启阶段生效:
- 挂载tracefs(若未自动挂载):
mount -t tracefs nodev /sys/kernel/tracing - 切换到function_graph跟踪器:
echo function_graph > /sys/kernel/tracing/current_tracer - 设置过滤规则(比如只跟踪reboot相关函数):
echo reboot* > /sys/kernel/tracing/set_ftrace_filter - 开启控制台输出:
echo 1 > /sys/kernel/tracing/trace_options/printk - 启动跟踪:
echo 1 > /sys/kernel/tracing/tracing_on
把这些命令写到启动脚本(比如/etc/rc.local)里,每次系统启动都会自动配置好,重启时的跟踪日志就会实时打在控制台。
三、额外优化建议
- 调高控制台日志级别:添加
loglevel=8到内核命令行,确保调试信息不会被截断(默认loglevel=7会过滤部分调试输出) - 用串口捕获日志:如果系统重启时控制台输出被覆盖,建议启用串口控制台,通过串口工具全程捕获输出,即使系统hang住,串口日志也能完整保留
- 针对偶现hang问题:如果重启是hang而非oops,
ftrace_dump_on_oops参数可能没用,还是靠trace_options=printk的实时输出更可靠
内容的提问来源于stack exchange,提问作者ksrikanth
相关产品推荐
相关产品推荐

