Получение «ошибки сегментации» после выполнения всего кода - PullRequest
1 голос
/ 24 января 2011

Я получаю ошибку сегментации после выполнения всего моего C-кода. Он генерирует требуемый вывод с утечкой памяти нулевым байтом. После этого отображается «ошибка сегментации». Далее вывод 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)

EDIT

    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);     
            }

EDIT

      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);
      }

Ответы [ 3 ]

7 голосов
/ 24 января 2011

Как отметили комментаторы, это звучит как переполнение буфера или какое-то другое событие, которое приводит к поврежденной куче, стеку вызовов или подобному.

Вы можете попробовать запустить свой код через Valgrind , он часто может ловить подобные ошибки.

1 голос
/ 24 января 2011

Символ _GLOBAL_OFFSET_TABLE_ заполняется динамическим компоновщиком во время выполнения. Повреждение в этом месте указывает на возможную проблему набора инструментов.

Несколько вещей для рассмотрения:

  • Попробуйте установить пакеты, содержащие символы отладки для библиотек GCC (libgcc и друзья) и для библиотеки C (glibc в большинстве дистрибутивов Linux). Это может позволить более детализировать обратную трассировку GDB.

  • Если вы создаете библиотеку, вам нужны опции -fpic или -fPIC для создания независимого от позиции кода. Без одного из них вы увидите поведение, которое может показаться очень странным.

  • Убедитесь, что вы не смешиваете и не сопоставляете ресурсы из разных версий набора инструментов.

1 голос
/ 24 января 2011

Segfault в конце программы также может быть признаком управления памятью, которое не было полностью разработано. Возможно, вы не спроектировали, какому объекту принадлежит какой объект и в каком порядке они будут удалены. Например, могут быть некоторые синглтоны или аналогичные, которые никогда не удаляются, и другие, которые удаляются, и некоторые из них ожидают, что другие все еще существуют, когда они действительно были удалены, а затем все разваливается на выходе.

...