我正在为我的网络课程开展一个小组项目。我们将实施一个3个部分的密钥分配中心; KDC本身,一个发起者(A)和一个响应者(B)在大学拥有的RedHat 6服务器上使用c ++和g ++。
我们一直在使用这个Practical Sockets库,事情进展相对顺利。
我的合作伙伴和我在fillAddr() function专门调用Unix的gethostbyname()函数时开始遇到段错误。
// Function to fill in address structure given an address and port
static void fillAddr(const string &address, unsigned short port,
sockaddr_in &addr) {
memset(&addr, 0, sizeof(addr)); // Zero out address structure
addr.sin_family = AF_INET; // Internet address
hostent *host; // Resolve name
if ((host = gethostbyname(address.c_str())) == NULL) { /* offending line */
// strerror() will not work for gethostbyname() and hstrerror()
// is supposedly obsolete
throw SocketException("Failed to resolve name (gethostbyname())");
}
addr.sin_addr.s_addr = *((unsigned long *) host->h_addr_list[0]);
addr.sin_port = htons(port); // Assign port in network byte order
}
我们使用了valgrind,GDB,“cout s”等进行调试,但一直在进行负面进展。以下是GDB回溯告诉我们的内容(服务器名称被删除,使用典型的“server.college.edu”地址):
Program received signal SIGSEGV, Segmentation fault.
0x00000039b1a7621b in malloc_consolidate () from /lib64/libc.so.6
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.107.el6.x86_64 libgcc-4.4.7-3.el6.x86_64 libstdc++-4.4.7-3.el6.x86_64
(gdb) backtrace
#0 0x00000039b1a7621b in malloc_consolidate () from /lib64/libc.so.6
#1 0x00000039b1a79385 in _int_malloc () from /lib64/libc.so.6
#2 0x00000039b1a7a911 in malloc () from /lib64/libc.so.6
#3 0x00000039b1b03265 in gethostbyname () from /lib64/libc.so.6
#4 0x00000000004033f7 in fillAddr (address="KDC", port=9284, addr=...)
at PracticalSocket.cpp:72
#5 0x0000000000404484 in UDPSocket::sendTo (this=0x7fffffffe410, buffer=0x6102a0, bufferLen=40, foreignAddress=
"KDC", foreignPort=9284) at PracticalSocket.cpp:299
#6 0x00000000004085e2 in sendRecv (sock=..., message="2007|137.28.8.164|SERVER_B|1234", addr=
"KDC", port=9284) at initiator.cpp:144
#7 0x0000000000407a3f in getSessionKey (sock=..., kdc_addr=0x40aa84 "KDC",
resp_addr=0x40aa98 "RESPONDER", nonce="1234") at initiator.cpp:88
#8 0x0000000000407546 in main (argc=1, argv=0x7fffffffe548) at initiator.cpp:49
似乎我们编译,测试,调试等只需要进行一些微小的更改,例如额外的std :: cout等,我们的代码执行得越少。这个fillAddr()函数至少在开始时成功使用了几次。现在将可靠地由malloc_consolidate()引起的段错误。
以下是目前的情况:
*** glibc detected *** ./kdc: malloc(): memory corruption: 0x000000000132b7d0 ***
*** glibc detected *** ./kdc: malloc(): memory corruption: 0x000000000132b7d0 ***
...
*** glibc detected *** ./kdc: malloc(): memory corruption: 0x000000000132b7d0 ***
这填补了我们KDC的控制台窗口。
任何帮助将不胜感激。如果您想了解更多信息,请告诉我们。
答案 0 :(得分:4)
如果你在malloc
类型函数的内部崩溃,你几乎肯定会破坏内存领域。
在某些时候,您(例如)已经分配了30个字节,然后尝试用60个字节的数据填充它。
您需要找出此问题的根本原因,遗憾的是,您显示的代码中不。在你致电gethostbyname()
之前,更有可能在你自己的代码中,在一些不确定的地方。寻找分配堆内存然后写入内存的任何地方。
你的“消极”进展也是这类问题的一个很好的迹象,因为一个破败的舞台可能会引发无数的问题。