-
场景:
系统20s左右,uart无输出,发生workqueue; -
使用ftrace命令:
echo 1 >/proc/sys/kernel/ftrace_dump_on_oops
echo 1 > /proc/sys/kernel/hardlockup_panic
echo 1 > /proc/sys/kernel/softlockup_panic
echo 4000 > /sys/kernel/debug/tracing/buffer_size_kb
echo 0 > /sys/kernel/debug/tracing/events/enable
echo 1 > /sys/kernel/debug/tracing/events/irq/enable
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_switch/enable
> /sys/kernel/debug/tracing/trace
echo 1 > /sys/kernel/debug/tracing/tracing_on
–>需要修改config,保证tracing的节点在,并且设置成功
- 添加panic函数到print_other_cpu_stall,在出现问题后,打印出当前每个cpu上task的状态
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -1381,6 +1381,7 @@ static void print_other_cpu_stall(struct rcu_state *rsp, unsigned long gpnum)
}
print_cpu_stall_info_end();
+ panic("Debug -----------");
for_each_possible_cpu(cpu)
totqlen += per_cpu_ptr(rsp->rda, cpu)->qlen;
pr_cont("(detected by %d, t=%ld jiffies, g=%ld, c=%ld, q=%lu)\n“”
验证设置是否正确:
echo x > /proc/sysrq-trigger
看串口输出,是否有call trace和ftrace log打印?
Note: 建议关闭watchdog,否则系统一直不喂狗,重启;