2011-01-24 60 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选项来创建与位置无关的代码。如果没有他们之一,你会看到很奇怪的行为,看起来好像

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