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