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)
因?yàn)槿鄙僬_的$ra,linux gdb也無(wú)法顯示調(diào)用棧。
可能的原因很多,比如該線(xiàn)程的內(nèi)核棧被沖掉(可能性較少,因?yàn)閮?nèi)核棧應(yīng)用層改不到)。
或者,該用戶(hù)線(xiàn)程執(zhí)行時(shí)把棧給沖掉了導(dǎo)致$ra為0,所以跳到0去執(zhí)行,導(dǎo)致epc為零。
應(yīng)對(duì)方法:
希望棧沒(méi)有被沖太多:0)
到do_page_fault()的地方,取得sp(r29)的值,然后顯示該用戶(hù)棧信息。
??????? printk("stack pointer: 0x%lx\n", regs->regs[29]);
??????? {
??????????? int i;
??????????? unsigned long * stack;
??????????? 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 ... 依賴(lài)于程序代碼段大小,多數(shù)是棧中保留的函數(shù)返回地址。
然后objdump -DS app.out
不難找到一些棕絲馬跡。
?
轉(zhuǎn)載于:https://blog.51cto.com/jiangjqian/772549
總結(jié)
以上是生活随笔為你收集整理的do_page_fault: epc == 00000000, ra == 00000000的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Windows Phone 7(WP7)
- 下一篇: BBC News 2012-02-07