sd卡写操作过程中控制sd卡电源进行掉电操作,基本必现Soc侧挂死问题;sysrq失去效能;只有独立于soc管理的mpu核可以dump出来数据;
最初怀疑是出现死锁,内核中开启DEBUG_SPINLOCK or PROVE_LOCKING拷机测试在未到挂死前出现了sd卡驱动中非法地址访问oops;
内核中只能开启soft lockup, hardlockup不支持,NMI特性与具体平台架构相关,此处也不能使用。
不是使能内核配置项场景下拷机基本没出现过oops问题,看来现成的工具是不能用了!!!
plan1
梳理当前平台及内核版本中GIC处理流程
利用内核watchdog对每个cpu核的监控特点,在cpu1响应次数大于cpu0响应次数+10时dump所有在怀疑点位增加的调试信息;
通过点位锁定目标,这种是一种笨办法,有没有更直接的可以看到backtrace信息的方法?
plan 2
起初尝试通过dump_backtrace将栈信息打印出来,但由于缺少栈顶无法多层次解析fun;
参考内核dump_backtrace_entry接口dump地址和此地址对象符号的方法处理,在watchdog_timer_fn接口中
struct rq *rq = NULL;
int *tmp_a = NULL;
rq = cpu_rq(0);
if (rq && rq->curr) {
printk("The CPU0 run task is %s\n", rq->curr->comm);
}
tmp_a = (int *)(rq->curr->stack); /*当前内核栈为8KB,因此仅使用高地址的4K;中断栈使用的是被抢占任务的stack区*/
printk("dump the CPU backtrace - start\n");
if (tmp_a) {
for (j = 1024; j < 2048; j++)
{
printk(" num_%d_data_[0x%x] fun %ps", j, tmp_a[j], tmp_a[j]);
}
}