2013-02-27 88 views
2

我想在C中使用gethostbyname()函數進行網絡分配。gethostbyname()錯誤 - 與內存管理有關

當我嘗試這樣做

struct hostent *host; 
char* addr = malloc (10*sizeof(char)); 
strcpy (addr, "localhost"); 
host= (struct hostent *) gethostbyname(addr); 

我碰到下面的錯誤。

glibc detected ./Sender: free(): invalid next size (normal): 0x0000000001584480 *** 
======= Backtrace: ========= 
/lib/x86_64-linux-gnu/libc.so.6(+0x7eb96)[0x7fcdbaca4b96] 
/lib/x86_64-linux-gnu/libc.so.6(fclose+0x155)[0x7fcdbac94815] 
/lib/x86_64-linux-gnu/libc.so.6(+0x103b16)[0x7fcdbad29b16] 
/lib/x86_64-linux-gnu/libc.so.6(__res_maybe_init+0x125)[0x7fcdbad2b3d5] 
/lib/x86_64-linux-gnu/libc.so.6(__nss_hostname_digits_dots+0x3d)[0x7fcdbad2db0d] 
/lib/x86_64-linux-gnu/libc.so.6(gethostbyname+0x8b)[0x7fcdbad32b7b] 
./Sender[0x401858] 
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7fcdbac4776d] 
./Sender[0x400a09] 
======= Memory map: ======== 
00400000-00403000 r-xp 00000000 08:07 3573874       /home/karthik/courses/Sem 6/Networks/Lab/lab4/Sender 
00602000-00603000 r--p 00002000 08:07 3573874       /home/karthik/courses/Sem 6/Networks/Lab/lab4/Sender 
00603000-00604000 rw-p 00003000 08:07 3573874       /home/karthik/courses/Sem 6/Networks/Lab/lab4/Sender 
01584000-015a5000 rw-p 00000000 00:00 0         [heap] 
7fcdbaa10000-7fcdbaa25000 r-xp 00000000 08:08 525634      /lib/x86_64-linux-gnu/libgcc_s.so.1 
7fcdbaa25000-7fcdbac24000 ---p 00015000 08:08 525634      /lib/x86_64-linux-gnu/libgcc_s.so.1 
7fcdbac24000-7fcdbac25000 r--p 00014000 08:08 525634      /lib/x86_64-linux-gnu/libgcc_s.so.1 
7fcdbac25000-7fcdbac26000 rw-p 00015000 08:08 525634      /lib/x86_64-linux-gnu/libgcc_s.so.1 
7fcdbac26000-7fcdbaddb000 r-xp 00000000 08:08 541113      /lib/x86_64-linux-gnu/libc-2.15.so 
7fcdbaddb000-7fcdbafda000 ---p 001b5000 08:08 541113      /lib/x86_64-linux-gnu/libc-2.15.so 
7fcdbafda000-7fcdbafde000 r--p 001b4000 08:08 541113      /lib/x86_64-linux-gnu/libc-2.15.so 
7fcdbafde000-7fcdbafe0000 rw-p 001b8000 08:08 541113      /lib/x86_64-linux-gnu/libc-2.15.so 
7fcdbafe0000-7fcdbafe5000 rw-p 00000000 00:00 0 
7fcdbafe5000-7fcdbb007000 r-xp 00000000 08:08 545991      /lib/x86_64-linux-gnu/ld-2.15.so 
7fcdbb1e4000-7fcdbb1e7000 rw-p 00000000 00:00 0 
7fcdbb203000-7fcdbb207000 rw-p 00000000 00:00 0 
7fcdbb207000-7fcdbb208000 r--p 00022000 08:08 545991      /lib/x86_64-linux-gnu/ld-2.15.so 
7fcdbb208000-7fcdbb20a000 rw-p 00023000 08:08 545991      /lib/x86_64-linux-gnu/ld-2.15.so 
7fff5c673000-7fff5c695000 rw-p 00000000 00:00 0       [stack] 
7fff5c7ff000-7fff5c800000 r-xp 00000000 00:00 0       [vdso] 
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0     [vsyscall] 
Aborted (core dumped)` 

我該如何解決這個問題?

+5

你的意思是'gethostbyname(addr);'而不是'gethostbyname(address);'? – 2013-02-27 11:07:45

+1

> gethostbyname *()和gethostbyaddr *()函數已過時。應用程序應該使用getaddrinfo(3)和getnameinfo(3)。鏈接:http://linux.die.net/man/3/getaddrinfo http://linux.die.net/man/3/getnameinfo由於glibc 2.8:_BSD_SOURCE || _SVID_SOURCE || _GNU_SOURCE – 2013-02-27 11:47:22

+0

「已過時」比「已棄用」更強,這意味着它已被刪除,可能已經工作了10年。 POSIX.1-2001指定gethostbyname(),gethostbyaddr(),...在該標準中被標記爲過時。 POSIX.1-2008刪除了gethostbyname(),gethostbyaddr()的規範... – 2013-02-27 13:33:36

回答

2

代碼中某處出現內存損壞,可能是您沒有顯示的部分。由於您的代碼段不是有效的C,我假定您手動鍵入或將其複製爲不完整。

要調試這種情況,如果您位於支持它的平臺上(如您所願),請使用DrMemoryValgrind。我更喜歡Valgrind的功能,而DrMemory可以說更快。

這兩個程序都能夠查明問題,甚至在有問題的程序仍在運行時將您附加到調試器。所以你可以檢查直播節目中的錯誤條件。


側面說明:如果你沒有以任何方式組裝的名字,你可以把它作爲一個字符串來gethostbyname

struct hostent *host; 
host = (struct hostent *) gethostbyname("localhost"); 
+0

這也應該是一個評論...不? – speeder 2013-02-27 13:10:28

+1

@speeder,這將是一個很好的答案,如果只有前綴「你的代碼中存在內存損壞,在你沒有顯示的部分。調試它......」 – ugoren 2013-02-27 13:40:48

+0

@ugoren:我總是打開建設性的批評。編輯答案。感謝您的建議。 – 0xC0000022L 2013-02-27 13:50:30

0

第一行缺少尾隨;

如果不是該OP是真正使用的addr的propably未初始化address而不是這個味道像到gethostbyname()實際調用之前已經happend內存損壞。

在假設

  • 使用address是一個錯字和
  • <netdb.h>#include

再說了malloc()的成功缺少的檢查,OP的代碼正確。

而且看起來是這樣的:

#include <netdb.h> 

... 

struct hostent * host = NULL; 
char * addr = malloc (10 * sizeof(*addr)); 
if (!addr) 
    perror("malloc"); 
else 
{ 
    strcpy (addr, "localhost"); 
    host = gethostbyname(addr); 
    ... 

所以,你可能會想用一個內存檢查工具如valgrind所以看到什麼錯誤。