2011-10-04 55 views
1

可能重複:
C++ Error: free(): invalid next size (fast):*** glibc的檢測*** sendip:免費():無效下一尺寸(正常):0x09da25e8 ***

這是一個C++問題(雖然'C++被濫用'問題)。替代重複:Facing an error: glibc detected free invalid next size (fast)


我使用Linux工具生成一些N/W的流量,但得到這個錯誤,當我嘗試發送更大的數據比一些長度,同時該工具有規定的。

我的整個項目都停留在兩者之間。由於我還沒有創建工具,所以不知道發生錯誤的確切位置......並且此錯誤(即使gdb)沒有提供有關問題的位置的任何提示。如何檢測錯誤點?

我給這個問題的一些快照,如果他們幫助。請指導我如何繼續?它看起來像一個網格給我。

[email protected] ~ $ sendip -v -p ipv6 -f file.txt -6s ::1 -p esp -es 0x20 -eq 0x40 -ei 
abcd -eI zxc -p tcp -ts 21 -td 21 ::2 | more 
*** glibc detected *** sendip: free(): invalid next size (normal): 0x09da25e8 *** 
======= Backtrace: ========= 
/lib/i386-linux-gnu/libc.so.6(+0x6b961)[0x17b961] 
/lib/i386-linux-gnu/libc.so.6(+0x6d28b)[0x17d28b] 
/lib/i386-linux-gnu/libc.so.6(cfree+0x6d)[0x18041d] 
/lib/i386-linux-gnu/libc.so.6(fclose+0x14a)[0x16b9ca] 
/lib/i386-linux-gnu/libc.so.6(+0xe053f)[0x1f053f] 
/lib/i386-linux-gnu/libc.so.6(__res_ninit+0x25)[0x1f0815] 
/lib/i386-linux-gnu/libc.so.6(__res_maybe_init+0x130)[0x1f1810] 
/lib/i386-linux-gnu/libc.so.6(__nss_hostname_digits_dots+0x34)[0x1f37d4] 
/lib/i386-linux-gnu/libc.so.6(gethostbyname2+0x96)[0x1f82f6] 
/usr/local/lib/sendip/ipv6.so(set_addr+0x2d)[0x3eec69] 
sendip(main+0x8eb)[0x804a635] 
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x126e37] 
sendip[0x8048f81] 
======= Memory map: ======== 
00110000-0026a000 r-xp 00000000 08:07 3408705 /lib/i386-linux-gnu/libc-2.13.so 
0026a000-0026b000 ---p 0015a000 08:07 3408705 /lib/i386-linux-gnu/libc-2.13.so 
0026b000-0026d000 r--p 0015a000 08:07 3408705 /lib/i386-linux-gnu/libc-2.13.so 
0026d000-0026e000 rw-p 0015c000 08:07 3408705 /lib/i386-linux-gnu/libc-2.13.so 
0026e000-00271000 rw-p 00000000 00:00 0 
002d6000-002da000 r-xp 00000000 08:07 923078  /usr/local/lib/sendip/tcp.so 
002da000-002db000 r--p 00003000 08:07 923078  /usr/local/lib/sendip/tcp.so 
002db000-002dc000 rw-p 00004000 08:07 923078  /usr/local/lib/sendip/tcp.so 
002dc000-002e0000 rw-p 00000000 00:00 0 
003ee000-003f0000 r-xp 00000000 08:07 923076  /usr/local/lib/sendip/ipv6.so 
003f0000-003f1000 r--p 00001000 08:07 923076  /usr/local/lib/sendip/ipv6.so 
003f1000-003f2000 rw-p 00002000 08:07 923076  /usr/local/lib/sendip/ipv6.so 

005fd000-00621000 r-xp 00000000 08:07 3408742 /lib/i386-linux-gnu/libm-2.13.so 
00621000-00622000 r--p 00023000 08:07 3408742 /lib/i386-linux-gnu/libm-2.13.so 
00622000-00623000 rw-p 00024000 08:07 3408742 /lib/i386-linux-gnu/libm-2.13.so 
006f7000-006fa000 r-xp 00000000 08:07 919265  /usr/local/lib/sendip/esp.so 
006fa000-006fb000 r--p 00002000 08:07 919265  /usr/local/lib/sendip/esp.so 
006fb000-006fc000 rw-p 00003000 08:07 919265  /usr/local/lib/sendip/esp.so 
006fc000-00700000 rw-p 00000000 00:00 0 
0081a000-00836000 r-xp 00000000 08:07 3408692 /lib/i386-linux-gnu/ld-2.13.so 
00836000-00837000 r--p 0001b000 08:07 3408692 /lib/i386-linux-gnu/ld-2.13.so 

00837000-00838000 rw-p 0001c000 08:07 3408692 /lib/i386-linux-gnu/ld-2.13.so 
0091d000-0091f000 r-xp 00000000 08:07 3408715 /lib/i386-linux-gnu/libdl-2.13.so 
0091f000-00920000 r--p 00001000 08:07 3408715 /lib/i386-linux-gnu/libdl-2.13.so 
00920000-00921000 rw-p 00002000 08:07 3408715 /lib/i386-linux-gnu/libdl-2.13.so 
009e7000-00a01000 r-xp 00000000 08:07 3408733 /lib/i386-linux-gnu/libgcc_s.so.1 
00a01000-00a02000 r--p 00019000 08:07 3408733 /lib/i386-linux-gnu/libgcc_s.so.1 
00a02000-00a03000 rw-p 0001a000 08:07 3408733 /lib/i386-linux-gnu/libgcc_s.so.1 

00fb3000-00fb4000 r-xp 00000000 00:00 0   [vdso] 
08048000-0804e000 r-xp 00000000 08:07 923064  /usr/local/bin/sendip 
0804e000-0804f000 r--p 00005000 08:07 923064  /usr/local/bin/sendip 
0804f000-08050000 rw-p 00006000 08:07 923064  /usr/local/bin/sendip 
08050000-08054000 rw-p 00000000 00:00 0 
09da1000-09dc2000 rw-p 00000000 00:00 0   [heap] 
b7600000-b7621000 rw-p 00000000 00:00 0 
b7621000-b7700000 ---p 00000000 00:00 0 
b77ce000-b77d0000 rw-p 00000000 00:00 0 
b77e1000-b77e2000 rw-p 00000000 00:00 0 
b77e2000-b77e3000 r--s 00000000 08:07 3148711 /home/udit/file.txt 
b77e3000-b77e5000 rw-p 00000000 00:00 0 
bfb5a000-bfb7b000 rw-p 00000000 00:00 0   [stack] 
esp 
Added 43 options 
Initializing module ipv6 
Initializing module esp 
Initializing module tcp 

我的glibc的版本..

[email protected] ~/Downloads/sendip-2.5-mec-2 $ ldd --version 
ldd (Ubuntu EGLIBC 2.13-0ubuntu13) 2.13 
... 

這是一個開源工具sendip,我試圖生成IPSec流量。如果任何代碼部分將被要求,我會在這裏添加它,但沒有時間來報告bug並等待它被修復,因爲acc。到我選擇它的工具規格爲我的目的,現在我完全停留在兩者之間。請爲我指導。

我知道幾乎不可能知道什麼是錯誤,甚至沒有看代碼。我只是要求你的幫助和建議,我應該在這種情況下做什麼,因爲它甚至不完全是我的錯誤。

如果有人可以告訴我任何工具,可以告訴我究竟是哪裏的問題?

我甚至不確定這個問題是否適合這裏;如果不是,請告訴我在哪裏遷移它?

建議我用valgrind試過。我從來沒有聽說過它,所以不知道如何繼續這裏是輸出。請指導我如何進一步瞭解它?

[email protected] ~ $ valgrind --leak-check=yes sendip -v -p ipv6 
-f file.txt -6s ::1 -p esp -es 0x20 -eq 0x40 -ei abcd -eI zxc 
-p tcp -ts 21 -td 21 ::2 

==12444== Memcheck, a memory error detector 
==12444== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al. 
==12444== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info 
==12444== Command: sendip -v -p ipv6 -f file.txt -6s ::1 -p esp 
-es 0x20 -eq 0x40 -ei abcd -eI zxc -p tcp -ts 21 -td 21 ::2 
==12444== 
esp 
Added 43 options 
Initializing module ipv6 
Initializing module esp 
Initializing module tcp 
==12444== Invalid write of size 1 
==12444== at 0x4027F40: memcpy (mc_replace_strmem.c:635) 
==12444== by 0x4032269: do_opt (esp.c:113) 
==12444== by 0x804A51D: main (sendip.c:575) 
==12444== Address 0x41cec5c is 5 bytes after a block of size 23 alloc'd 
==12444== at 0x402699A: realloc (vg_replace_malloc.c:525) 
==12444== by 0x4032231: do_opt (esp.c:111) 
==12444== by 0x804A51D: main (sendip.c:575) 
==12444== 
Finalizing module tcp 
Finalizing module esp 
Finalizing module ipv6 
Final packet data: 
60 00 00 00 `... 
00 5B 32 20 .[2 
/*rest packet content*/ 
65 66 0A 0A ef.. 
00 00 02 06 .... 
1E 97 1E ... 
Couldn't open RAW socket: Operation not permitted 
Freeing module ipv6 
Freeing module esp 
Freeing module tcp 
==12444== 
==12444== HEAP SUMMARY: 
==12444==  in use at exit: 16 bytes in 1 blocks 
==12444== total heap usage: 118 allocs, 117 frees, 8,236 bytes allocated 
==12444== 
==12444== 16 bytes in 1 blocks are definitely lost in loss record 1 of 1 
==12444== at 0x40268A4: malloc (vg_replace_malloc.c:236) 
==12444== by 0x4031F47: ??? 
==12444== by 0x804A34F: main (sendip.c:517) 
==12444== 
==12444== LEAK SUMMARY: 
==12444== definitely lost: 16 bytes in 1 blocks 
==12444== indirectly lost: 0 bytes in 0 blocks 
==12444==  possibly lost: 0 bytes in 0 blocks 
==12444== still reachable: 0 bytes in 0 blocks 
==12444==   suppressed: 0 bytes in 0 blocks 
==12444== 
==12444== For counts of detected and suppressed errors, rerun with: -v 
==12444== ERROR SUMMARY: 4 errors from 2 contexts (suppressed: 30 from 11) 
+0

okkkkkk ......現在它的工作它缺少libgc'我已經安裝了一個包',它是工作fine.But太用'valgrind'建議。 –

回答

5

也許你已經與記憶是一團糟,寫的東西,你不應該(例如,由於緩衝區溢出)。

如果您想知道緩衝區溢出如何導致「無效的空閒」錯誤,請考慮以下示例。

假設你動態分配的10個字節數組A,然後B.結構

C運行通常會將有關的malloc /新發布之前的地址返回給用戶分配的內存塊的信息,所以很容易在免費調用中恢復大小。

現在,假設你混淆了數組下標和A [11] = value。您的值將被放置在C運行時保留的字段中,以存儲上述信息,從而將其變爲無意義,因此C運行時將捕獲嘗試釋放B並中止執行的錯誤。

既然你是在Linux上,你可以使用Valgrind追查問題和消除它。

0

錯誤消息意味着glibc檢測到內存損壞,這是不好的。 sendip程序可能有錯誤。例如,它可能在錯誤的時間或多次存儲內存,或者可能有一個流浪的指針。

我建議大家報告這個錯誤給sendip作者。向他們發送所有這些信息。

我也建議你檢查什麼是sendip的最新版本,可以從它的開發者,並試圖從他們的最新的源代碼的副本進行編譯。最新版本可能會修復此錯誤。

如果您想嘗試進一步排查問題,我建議您在valgrind下運行您的sendip命令行,然後在此處剪切並粘貼結果並將其報告給sendip的開發人員。如果您安裝了sendip的調試符號,或者在啓用了調試符號的情況下從源代碼重新編譯它也會有所幫助。

0

的Valgrind的輸出指向你在正確的bug:

==12444== Invalid write of size 1 

程序寫信給內存它不應該有。

==12444== at 0x4027F40: memcpy (mc_replace_strmem.c:635) 
==12444== by 0x4032269: do_opt (esp.c:113) 
==12444== by 0x804A51D: main (sendip.c:575) 

這是在違規寫入點的堆棧跟蹤。 memcpy只是做了它所告訴的,所以故障在do_opt,在esp.c的第113行。根據優化,您可能會或可能找不到memcpy的呼叫,但某處在該區域試圖將一塊內存複製到錯誤的地方。該錯誤的根本原因可能稍高於計算複製的目標地址的情況。

==12444== Address 0x41cec5c is 5 bytes after a block of size 23 alloc'd 

這說明其中程序試圖寫它不應該有。 「[mableced block]之後的5個字節」正是那種會導致glibc的malloc的原始錯誤消息的錯誤寫入,這會將其內部數據結構放置在爲應用程序使用而分配的內存塊之間。

順便提一下,12444號只是程序的進程ID - 如果你正在運行valgrind下的一個叫fork的程序,這很有用,否則可以忽略。

+0

哇.......它的運行,但令人驚訝的是,當我試圖運行'valgrind'時,它並沒有在第一次運行時運行,它告訴我先安裝'libgc'.After我安裝它並運行'valgrind'出現以下輸出。但現在命令開始正常工作這是什麼魔術?並且'valgrind'現在也不顯示錯誤。 –

+0

我對'libgc'不熟悉,我的'valgrind'副本從未要求我這樣做。但是,安裝它很可能會擾亂您的執行環境並隱藏錯誤 - 請嘗試再次移除它。 – zwol

相關問題