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