do_page_fault: epc == 00000000, ra == 00000000

do_page_fault() #2: sending SIGSEGV to linux_stb for invalid read access from
00000000 (epc == 00000000, ra == 00000000)
由于缺乏正确的$ra,linux gdb也没法显示调用栈。
可能的缘由不少,好比该线程的内核栈被冲掉(可能性较少,由于内核栈应用层改不到)。
或者,该用户线程执行时把栈给冲掉了致使$ra为0,因此跳到0去执行,致使epc为零。linux

应对方法:
但愿栈没有被冲太多:0)
到do_page_fault()的地方,取得sp(r29)的值,而后显示该用户栈信息。app

        printk("stack pointer: 0x%lx\n", regs->regs[29]);
        {
            int i;
            unsigned long * stack;ide

            stack = (unsigned long *)regs->regs[29];
            for(i = 0; i < 64; i ++)
            {
                if(i % 4 == 0) printk("\n");
                printk("%08lx ", stack[i]);
            }
            printk("\n");
           
        }函数

好比:
00000000 00000000 00208000 004f3288
00799c60 004f330c 00000000 30590e44
30590df4 008b3918 008b3af0 004de850
00000000 30590e44 00001437 0020e0ff
00799c60 00000000 00000001 004eb8fc
00000000 00000000 00000000 00000000
00799c60 00000000 00000001 00000000线程

其中004xxxxx 005xxxxx ... 依赖于程序代码段大小,多数是栈中保留的函数返回地址。
而后objdump -DS app.out
不难找到一些棕丝马迹。
 it

相关文章
相关标签/搜索