以下の calloc() 呼び出しでクラッシュする以下のような C コードがあります。
... 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 プロンプトで次のことを行います。
フレーム 2 に移動して、そのユーザー コード スタック フレームに移動し、変数 (flds、ポインター (ipl)) の値を出力すると、問題ないように見えます。明らかに NULL の逆参照はありません。
しかし、それでも calloc() は失敗し、そこでクラッシュします。このコードは、以前は複数回正常に実行されていましたが、後でアプリケーションをしばらく実行するとクラッシュします。(メモリリーク?? valgrindを実行しようとしますが、valgrind memcheckツールで実行すると、コードクラッシュの動作が再現できなくなります)
これをデバッグして修正するのに役立つポインタを探しています。
関連する情報 - gcc: 4.4.4 。Red Hat Enterprise Linux サーバー 6.0 64 ビット Linux