2012-01-28 15 views
3

使い慣れたfree():無効なポインタエラーが発生しました。デバッグしようとすると、が残っていない限り、私は自分のコード内のfree()を1つずつコメントアウトして終了しました。が残っていますが、このランタイムエラーが発生しています。他の誰かが同様の問題にぶつかっていますか?free()無効なポインタ

ところで、エラーメッセージが表示されたときにサーバー全体が実際にクラッシュすることはなく、単一のクライアントを処理していた特定のフォークされたプロセスだけがgdbを使用してこれをデバッグすることは難しいです。

ありがとうございます。

============================== 
*** glibc detected *** ./server: free(): invalid pointer: 0x08641a38 *** 
======= Backtrace: ========= 
/lib/i386-linux-gnu/libc.so.6(+0x6b961)[0xefe961] 
/lib/i386-linux-gnu/libc.so.6(+0x6d28b)[0xf0028b] 
/lib/i386-linux-gnu/libc.so.6(cfree+0x6d)[0xf0341d] 
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZdlPv+0x21)[0x4c74d1] 
./server[0x804b499] 
./server[0x804b2ad] 
./server[0x804aecd] 
./server[0x804ad36] 
./server[0x804a3a3] 
/lib/i386-linux-gnu/libc.so.6(+0x2fa6f)[0xec2a6f] 
/lib/i386-linux-gnu/libc.so.6(+0x2facf)[0xec2acf] 
./server[0x804966b] 
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0xea9e37] 
./server[0x8049331] 
======= Memory map: ======== 
00338000-00352000 r-xp 00000000 08:01 394236  /lib/i386-linux-gnu/libgcc_s.so.1 
00352000-00353000 r--p 00019000 08:01 394236  /lib/i386-linux-gnu/libgcc_s.so.1 
00353000-00354000 rw-p 0001a000 08:01 394236  /lib/i386-linux-gnu/libgcc_s.so.1 
003c1000-003c2000 r-xp 00000000 00:00 0   [vdso] 
0041d000-004fc000 r-xp 00000000 08:01 792946  /usr/lib/i386-linux-gnu/libstdc++.so.6.0.14 
004fc000-00500000 r--p 000de000 08:01 792946  /usr/lib/i386-linux-gnu/libstdc++.so.6.0.14 
00500000-00501000 rw-p 000e2000 08:01 792946  /usr/lib/i386-linux-gnu/libstdc++.so.6.0.14 
00501000-00508000 rw-p 00000000 00:00 0 
00664000-00688000 r-xp 00000000 08:01 394245  /lib/i386-linux-gnu/libm-2.13.so 
00688000-00689000 r--p 00023000 08:01 394245  /lib/i386-linux-gnu/libm-2.13.so 
00689000-0068a000 rw-p 00024000 08:01 394245  /lib/i386-linux-gnu/libm-2.13.so 
00793000-007af000 r-xp 00000000 08:01 394195  /lib/i386-linux-gnu/ld-2.13.so 
007af000-007b0000 r--p 0001b000 08:01 394195  /lib/i386-linux-gnu/ld-2.13.so 
007b0000-007b1000 rw-p 0001c000 08:01 394195  /lib/i386-linux-gnu/ld-2.13.so 
00960000-0096a000 r-xp 00000000 08:01 394254  /lib/i386-linux-gnu/libnss_files-2.13.so 
0096a000-0096b000 r--p 00009000 08:01 394254  /lib/i386-linux-gnu/libnss_files-2.13.so 
0096b000-0096c000 rw-p 0000a000 08:01 394254  /lib/i386-linux-gnu/libnss_files-2.13.so 
00e93000-00fed000 r-xp 00000000 08:01 394208  /lib/i386-linux-gnu/libc-2.13.so 
00fed000-00fee000 ---p 0015a000 08:01 394208  /lib/i386-linux-gnu/libc-2.13.so 
00fee000-00ff0000 r--p 0015a000 08:01 394208  /lib/i386-linux-gnu/libc-2.13.so 
00ff0000-00ff1000 rw-p 0015c000 08:01 394208  /lib/i386-linux-gnu/libc-2.13.so 
00ff1000-00ff4000 rw-p 00000000 00:00 0 
08048000-08056000 r-xp 00000000 08:01 1084793 /home/mwrosen/cpe464/prog2/server 
08056000-08057000 r--p 0000d000 08:01 1084793 /home/mwrosen/cpe464/prog2/server 
08057000-08058000 rw-p 0000e000 08:01 1084793 /home/mwrosen/cpe464/prog2/server 
08641000-08662000 rw-p 00000000 00:00 0   [heap] 
b7600000-b7621000 rw-p 00000000 00:00 0 
b7621000-b7700000 ---p 00000000 00:00 0 
b7718000-b771b000 rw-p 00000000 00:00 0 
b7729000-b772c000 rw-p 00000000 00:00 0 
bfacf000-bfaf0000 rw-p 00000000 00:00 0   [stack] 
+1

投稿するコードはありませんか? –

+0

ジム - コードが長く、それは学校の割り当てなので、インターネット上で自分のソリューションを投稿することはできません。主に、私は、誰かが、私のコードからすべてのfree()が削除された後でも、なぜこのエラーが発生しているのかについていくつかの洞察を得たいと考えていました。ごめんなさい! – MitchellSalad

+1

@MitchellSalad:あなたのコードを再現ケース(50LoC未満、自己完結型、問題の再現)に減らす過程で、あなたはその問題を見つける可能性が非常に高いです。そうでない場合は、ここに持ってきて助けを求めるのに最適なコードがあります。 – sbi

答えて

5

valgrindを使用して問題をデバッグしてください。

あなたの誤差があってもすべて削除freeで持続する場合、いくつかのコードは、そのメモリ領域(例えば、バッファオーバーフロー)が溢れているので、それがあってもよいです。

6

コードが他のコードで使用されているポインタを破棄した場合、無効なポインタに他のコードがfreeを呼び出すことがあります。あなたが所有していないメモリにアクセスしている可能性があります。

あり、これが起こることができる多くの方法がここに、二つの一般的なものは次のとおりです。

1)あなたはint f[7];のような配列を宣言する場合は、最後の配列要素はf[6]です。 f[7]を変更すると、他人のメモリが壊れる可能性があります。

2)スタックに割り当てられたオブジェクトへのポインタを保存すると、そのオブジェクトが有効範囲外になり、そのポインタで何かを変更すると、他の人のメモリが壊れる可能性があります。