2011-01-24 16 views
1

すべてのCコードを実行した後にセグメントエラーが発生しています。 0バイトのメモリリークでrquired出力を生成します。その後、 "segmentation fault"が表示されます。次に、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); 
     } 
+0

おそらく破損しているスタックトレースを調べることで何も言い難いです。実際のエラーはどこでもかまいません。おそらくバッファオーバーフローなどです。コードを慎重に見て、コードのさまざまな部分をコメントアウトして、そのあとでエラーがまだ発生していないかどうかを確認する以外は何もお勧めしません。 –

+0

GDBにアクセスできない場合は、いくつかのブレークポイントを入れてデバッグしようとしません。コアが生成されましたか? – Vaibhav

+0

デバッグシンボルを有効にしてプログラムをコンパイルしましたか? '-g' GCCオプションを使って?あなたのバックトレースは本当に役に立ちませんが、たぶん壊れている可能性があります。 – thkala

答えて

7

コメンターが指摘したように、これはバッファオーバーランまたは破損したヒープにつながるいくつかの他のイベント、コールスタックのように聞こえる、または類似。

Valgrindでコードを実行しようとすると、よくそのような間違いをキャッチすることができます。

1

プログラム終了時のSegfaultは、完全には設計されていないメモリ管理の兆候でもあります。どのオブジェクトがどのオブジェクトを所有し、どの順序で削除されるかを設計していない可能性があります。たとえば、削除されないシングルトンや類似のものや、実際に削除されたときに残っているものが残っていることを期待するものがあります。

1

_GLOBAL_OFFSET_TABLE_シンボルは実行時にダイナミックリンカによって埋められます。その場所の破損により、ツールチェインの問題が発生する可能性があります。

考慮すべきいくつかのこと:

  • はGCCライブラリ(libgccや友人)のためとCライブラリのデバッグシンボル(ほとんどのLinuxディストリビューションでglibc)を含むパッケージをインストールしてください。これにより、GDBのバックトレースをより詳細にすることができます。

  • ライブラリを作成する場合、位置に依存しないコードを作成するには、-fpicまたは-fPICオプションが必要です。それらのいずれかがなければ、あなたはふさわしい行動を見るでしょう非常に変です。

  • 異なるツールチェーンバージョンの&リソースが混在していないことを確認してください。