在执行整个代码后获得“分段错误”

时间:2011-01-24 10:32:43

标签: c gdb segmentation-fault

我执行所有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)

修改

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

3 个答案:

答案 0 :(得分:7)

正如评论者所指出的那样,这听起来像是缓冲区溢出或导致损坏的堆,调用堆栈或类似事件的其他事件。

您可以尝试通过Valgrind运行代码,它通常会遇到错误。

答案 1 :(得分:1)

程序结束时的Segfault也可能是内存管理的一个标志,尚未完全设计。您可能没有设计哪个对象拥有哪个对象以及它们将被删除的顺序。例如,可能会有一些单身或类似的东西永远不会被删除而其他人会这样做,而其中一些人则期望其他人在真正被删除时仍然存在,然后一切都在出口处分崩离析。

答案 2 :(得分:1)

动态链接器在运行时填充_GLOBAL_OFFSET_TABLE_符号。该位置的损坏指向可能的工具链问题。

需要考虑的一些事项:

  • 尝试安装包含GCC库(libgcc和朋友)和C库(大多数Linux发行版上为glibc)的调试符号的软件包。这可能会使GDB回溯更加详细。

  • 如果您要创建库,则需要-fpic-fPIC选项来创建与位置无关的代码。如果没有其中任何一个,你会看到似乎非常奇怪的行为。

  • 确认您没有混合&amp;匹配来自不同工具链版本的资源。