0

这段代码第一次进入循环时运行完美,第二次出现get seg错误,如果我再次运行program..quit..run,它也可以完美运行

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

gdb 中的 bt 给出

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()进入循环

4

2 回答 2

1

您可能在程序的其他地方有一些未定义的行为(例如,缓冲区溢出、大小不合适、对 的malloc调用错误或丢失free……)

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

请注意,gdbwatch命令可能非常方便。

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

于 2013-05-03T13:12:12.853 回答
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 区域。

于 2013-05-03T13:36:08.647 回答