很多时候,内核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, &regs);
        }