c++ - gethostbyname 中的 malloc_consolidate 出现段错误

标签 c++ c segmentation-fault gethostbyname

一些背景信息:

我正在为我的网络课做一个小组项目。我们将实现一个由 3 部分组成的 key 分配中心; KDC 本身、发起者 (A) 和响应者 (B),在大学拥有的 RedHat 6 服务器上使用 c++ 和 g++。

我们一直在使用这个Practical Sockets图书馆和事情进展得相对顺利。

问题:

我和我的伙伴在调用 Unix 的 gethostbyname() 函数(特别是在 fillAddr() function 中)时开始出现段错误。 .

// 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 的控制台窗口。

任何帮助将不胜感激。如果您想了解更多信息,请告诉我。

最佳答案

如果您在 malloc 类型函数的内部崩溃,那么几乎可以肯定您已经损坏了内存区域。

在某些时候,您(例如)分配了 30 个字节,然后尝试用 60 个字节的数据填充它。

您需要找出此问题的根本原因,不幸的是,您所显示的代码没有。它更有可能出现在您自己的代码中,在您调用 gethostbyname() 之前的某个不确定点。查找分配堆内存的位置,然后写入。

你的“负面”进展也很好地表明了此类问题,因为废弃的竞技场可能会导致无数问题。

关于c++ - gethostbyname 中的 malloc_consolidate 出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15915920/

相关文章:

c++ - 我有一个map<string, vector<record>>,如何从vector<record>中删除记录?

c++ - 如何对hdf5时间序列进行查询

使用 gcc 编译时关闭程序

c - 使用 X 宏扩展时强制字符串和指针进入闪存

c - if 语句段错误

c - mkfifo 的段错误

c++ - 我在玩井字游戏时遇到问题?

c++ - 如何防止用户在下面的示例代码中输入多个字符?

c - 将具有 union 字段的 C 结构映射到 Go 结构

c - ubuntu 中的段错误