这段代码在第一次进入循环时运行完美,第二次给出了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()
进入循环
答案 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区域。