2011-01-24 36 views
1

執行完所有C代碼後,我得到了segementation錯誤。它生成零字節內存泄漏的必需輸出。之後,顯示「分段故障」。以下是gdb輸出。執行整個代碼後得到「分段錯誤」

Program received signal SIGSEGV, Segmentation fault. 
0x08060f90 in _GLOBAL_OFFSET_TABLE_() 
(gdb) bt 
#0 0x08060f90 in _GLOBAL_OFFSET_TABLE_() 
#1 0xffbecd18 in ??() 
#2 0x15048815 in ??() 
#3 0xcd0fbecd in ??() 
#4 0x0610ffbe in ??() 
#5 0xffbecd08 in ??() 
#6 0xf7f79ff4 in ??() from /lib/tls/libc.so.6 
#7 0x00000000 in ??() 
(gdb) 

編輯

char **Connections,**Doors,**Zones; 
    char *s1,*s2; 
    char con[] = "c_"; 
    char zon[] = "z_"; 
    char dor[] = "d_"; 


    for (i=0; i<nc ; i++){ 
    s1 = con; 
    s2 = string_IntToString(i); 
    Connections[i]= string_Conc(s1,s2); 
    string_StringFree(s2);  
      } 

編輯

 char* string_Conc(const char* s1, const char* s2) 
     { 
     char* dst; 

    dst = memory_Malloc(strlen(s1) + strlen(s2) + 1); 
    strcpy(dst, s1); 
    return strcat(dst,s2); 
     } 
+0

通過查看可能損壞的堆棧跟蹤很難說出任何內容。真正的錯誤可能在任何地方,很可能是緩衝區溢出或類似的東西。除了仔細查看代碼並嘗試評論它的各個部分之外,很難推薦任何東西,檢查錯誤是否仍然存在。 – 2011-01-24 10:40:34

回答

7

正如評論者所指出的,這聽起來像一個緩衝區溢出或導致損壞堆一些其他事件,調用棧,或類似。

您可以嘗試通過Valgrind運行您的代碼,它可以經常發現類似的錯誤。

1

程序結束時的段錯誤也可能是未完全設計的內存管理的標誌。您可能沒有設計哪個對象擁有哪個對象,並且按照何種順序將它們刪除。例如,可能存在一些單身人士或類似人物,這些人永遠不會被刪除,其他人也會這樣做,並且其中一些人希望其他人在真正被刪除時仍然存在,然後在出口處所有東西都會分崩離析。

1

_GLOBAL_OFFSET_TABLE_符號在運行時由動態鏈接器填充。該地點的腐敗指向了一個可能的工具鏈問題。

有幾件事情要考慮:

  • 嘗試安裝包含調試符號的GCC庫(libgcc和朋友)和C庫(glibc在大多數Linux發行版)軟件包。這可能允許GDB回溯更加詳細。

  • 如果您正在創建庫,則需要使用-fpic-fPIC選項來創建與位置無關的代碼。如果沒有他們之一,你會看到很奇怪的行爲,看起來好像

  • 確認您不混合&匹配來自不同工具鏈版本的資源。