2012-05-01 26 views
1

私ははcalloc(でクラッシュした下記のようにCのコードの一部を持ってクラッシュ:のcallocの呼び出しが失敗し、以下のコードは、呼び出し)

... some code 
free (ipl->fldptr); 
ipl->fldptr = calloc (flds*4, sizeof(struct fldptr_type)); 
...some more code 

が、私はそれをgdbをしようとした私は、クラッシュ時に下記のバックトレースを取得します:

Program received signal SIGSEGV, Segmentation fault. 
0x0000003ade478f94 in _int_malloc() from /lib/libc.so.6 
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.7.el6.x86_64 libgcc-4.4.4-13.el6.x86_64 libstdc++-4.4.4-13.el6.x86_64 
(gdb) bt 
#0 0x0000003ade478f94 in _int_malloc() from /lib/libc.so.6 
#1 0x0000003ade4796d8 in calloc() from /lib/libc.so.6 
#2 0x0000000000daf00d in myfunction (ipl=0x106f75f0, flds=11) 
    at myfile.c:1286 

デバッグの一環として、私はgdbのプロンプトで次のように実行します。そのユーザーコードのスタックフレーム と変数のプリント値(FLDS、ポインタ(IPL)に行くことに

フレーム2と、彼らはOK思えませんN明らかにULL逆参照。

しかし、まだcalloc()は失敗し、そこでクラッシュします。このコードは以前は複数回正常に実行されていましたが、アプリケーションがしばらく実行された後にクラッシュします。 (メモリリーク?tryintのvalgrindを実行するには、valgrind memcheckツールで実行すると、コードクラッシュの動作が繰り返されません。)

私はデバッグや修正に役立ついくつかのポインタを探していますこの。

関連情報 - gcc:4.4.4。 Red Hat Enterprise Linuxサーバー6.0 64ビットLinux

+1

おそらく、ヒープを破損し、* alloc()内部データ構造を破壊している可能性があります。このようなエラーを見つけるより簡単な方法は、あなたのプログラムを 'valgrind'を通して実行することです。 – FatalError

答えて

4

おそらく破損しているヒープがあります。 freeされているいくつかのメモリが早すぎる(まだ再利用)、またはいくつかのバッファオーバーフローあなたはこのような問題をデバッグするためにvalgrindを使用する必要があります

(または無効ptr[-3]のようなアクセス)-d。

また、Boehm's conservative garbage collectorを使用することもできます。

また、gdbで手動でこのようなバグを見つけ出すこともできます。 watch gdbコマンドを使用し、address space layout randomizationを無効にすると役立ちます。

私は(xが誤って間接参照を取得しますので、もし、あなたがすぐにSIGSEGVを取得します)また、あなたがfree -dを持って、常に明確な指針に示唆ので、あなたのコード内でfree(x), x=NULLでどこでもfree(x)交換してください。

GCC(最新バージョンは4.7)のスタックプロテクタ機能を使用することもできます。 this questionを参照してください。

+1

私はBoehm gcをどこにも勧めていません.Cの初心者にはあまりお勧めできません。「悪い方が良い」という典型的な例です。メモリリークやUBでいっぱいの恐ろしいコードに繋がることは間違いありません。 –

+0

必ずしもそうではありません:あなたのCコードのすべてでBoehmのGCを使用することを選択することができます... –

+0

そして、それはまだ間違っていて、メモリリークとメモリの枯渇の対象となります。これは* conservative * GCの意味です。 http://stackoverflow.com/questions/4039274/was-there-a-specific-reason-garbage-collection-was-not-designed-for-c/4039474#4039474 –