2013-02-26 262 views
1

得到seg故障後,我使用了gdb a.out core命令。後來我用backtrace(bt),這是gdb告訴我的爲什麼我會遇到seg故障?

警告:核心文件可能與指定的可執行文件不匹配。

警告:錯誤讀數在0xfbe8

警告共享庫列表條目:錯誤讀取共享庫列表條目在0x74c085ff

核心是通過「family.out smith.ged」產生。

程序以信號11終止,分段故障。

(poundsign)0 0x08086a6在count_records()

(GDB)BT

(poundsign)0 0x080486a6在count_records()

(poundsign)1 0x08048906在__libc_csu_init()

(英鎊)2 0xbf85624c在??()

(英鎊)3 0xbf856310在?? ()

回溯停止:以前的FRAM內這個框架

可能有人給我一些見解,以什麼可能導致此賽格故障(堆棧損壞?)?通常gdb給我的程序中的行號,但這次它沒有。

+2

你有機會訪問你並不擁有的內存。除此之外,可能需要看代碼! – 2013-02-26 04:49:15

+0

gdb輸出表明您正在查看由不同二進制文件生成的核心文件。要調試你的應用程序,你可以在gdb中運行它(使用「gdb binary」,然後是「run」命令),或者使用像valgrind之類的東西。 – vanza 2013-02-26 04:50:17

+0

絕對使用valgrind進行segfaults。 – matzahboy 2013-02-26 04:50:33

回答

3

這裏可能發生的是你已經損壞了堆棧。程序的很多狀態(包括告訴你你在哪個函數中的所有堆棧幀)都駐留在堆棧中,所以一旦被覆蓋,調試器只能處理損壞的信息。

這樣做的一種常用方法是將聲明爲本地變量的緩衝區溢出爲字符串,例如,

int main() 
{ 
    char buf[4]; 
    return func1(buf); 
} 

int func1(char* theBuf) 
{ 
    return func2(theBuf); 
} 

int func2(char* sameBufBackSomeplaceInTheStack) 
{ 
    sprintf(sameBufBackSomeplaceInTheStack, "The stack is doomed."); 
    return 0; 
} 

結果可能會有所不同,但是我破壞堆棧看起來像這樣在調試器我這樣做後:

Program received signal EXC_BAD_ACCESS, Could not access memory. 
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000000 
0x0000000100000d00 in _mh_execute_header() 
(gdb) where 
#0 0x0000000100000d00 in _mh_execute_header() 
#1 0x0000000000000000 in ??() 
(gdb) 

反正,某處某處你的程序覆蓋堆棧,這往往是挑戰去調試...