很多时候,内核oops还是很好处理的,因为可以看到当时的函数调用栈。objdump -DS vmlinux,配合epc(程序指针)可以定位情况发生时的代码位置。有些调试器,支持断点地址设置,可以直接显示问题发生时的代码位置。
然而,当系统陷入某种死锁状态。又比如应用程序进行的系统调用不能退出等等。这种情况下,显示当前所有线程的当前函数调用栈就有很大的帮助作用了。
我们可以通过外部触发事件,比如按键,终端输入。或者在程序代码中设定定时器。在事件处理程序中,显示当前所有线程或者关心的线程的函数调用栈。
if(task == current)
{
dump_stack();
}else
{
regs.regs[29] = task->thread.reg29;
regs.regs[31] = task->thread.reg31;
regs.cp0_epc = 0;
show_backtrace(task, ®s);
}
转载于:https://blog.51cto.com/jiangjqian/772327