gethostbyname的第二次调用给出了seg错误

时间:2013-05-03 13:09:20

标签: c sockets segmentation-fault

这段代码在第一次进入循环时运行完美,第二次给出了seg seg错误,如果我再次运行program..quit..run,它完美运行

if ((server=gethostbyname(HOSTA))==NULL){
    fprintf(stderr,"\n\tRESOLVE SERVER FAIL\n\n");
    exit(3);
}

bt in gdb给出

Program received signal SIGABRT, Aborted.
0x0012d422 in __kernel_vsyscall ()
(gdb) bt
#0  0x0012d422 in __kernel_vsyscall ()
#1  0x00197681 in raise () from /lib/tls/i686/cmov/libc.so.6
#2  0x0019aab2 in abort () from /lib/tls/i686/cmov/libc.so.6
#3  0x001d124d in ?? () from /lib/tls/i686/cmov/libc.so.6
#4  0x001db341 in ?? () from /lib/tls/i686/cmov/libc.so.6
#5  0x001dcb98 in ?? () from /lib/tls/i686/cmov/libc.so.6
#6  0x001dfc7d in free () from /lib/tls/i686/cmov/libc.so.6
#7  0x001cb85a in fclose () from /lib/tls/i686/cmov/libc.so.6
#8  0x002d0734 in ?? () from /lib/tls/i686/cmov/libnss_files.so.2
#9  0x002d1b9f in _nss_files_gethostbyname_r () from /lib/tls/i686/cmov/libnss_files.so.2
#10 0x002577de in gethostbyname_r () from /lib/tls/i686/cmov/libc.so.6
#11 0x00257036 in gethostbyname () from /lib/tls/i686/cmov/libc.so.6
#12 0x0804a00c in update () at main.h:144
#13 0x0804b247 in main (argc=1, argv=0xbffff4a4) at main.c:78
(gdb) q

注意:我是一个菜鸟作为调试器

我的解释是,我不能免费在struct hostent或gethostbyname本身的返回

代码:@pastebin

我做错了什么?

编辑:函数update()进入循环

2 个答案:

答案 0 :(得分:1)

您的程序中可能有一些未定义的行为其他(例如缓冲区溢出,malloc的大小不合适,free的错误或缺失调用,.... )

尝试使用-Wall -g(也许还-Wextra)编译您的程序,并使用gdb调试器和valgrind内存泄漏检测器。

请注意gdb具有watch命令,这可能非常方便。

此外,gethostbyname(3)被记录为过时(并且可能返回一些指向静态数据的指针)。请改用getaddrinfo

答案 1 :(得分:1)

我也无法指出确切的问题,但函数肯定存在一些错误。我注意到了这一点:

  char *stringA;
  ....
   if((stringA=malloc(BUFSIZEE))==NULL){
            printf("\n\tMEMORY ERROR\n\n");
            exit(1);
    }
    stringA=build_get_query(HOSTA,page);
    if((write(sockfd,stringA,strlen(stringA)))<0){
            printf("\n\tERROR ON SEND\n\n");
    }

当build_get_query返回一些其他地址(大概)时,你正在丢失存储在stringA中的指针(由malloc返回)。并且根据返回数据的大小和分配方法,如果a)它没有动态分配,你可以进行段错误b)在其他地方释放c)大小与BUFSIZE不同(你多次memset stringA并将其用作BUFSIZE缓冲区)

编辑:为了澄清,“字符串”即字符数组不能通过赋值在C中复制。该函数可以返回一个指针,但返回值不能填充malloced区域。