我真的需要帮助来调试一些不断出现的内存损坏错误。一些信息:
- Boost::Asio 用于通过 UDP 接收 som protobuf 数据包。我很确定这与此有关。
- 使用 valgrind 会使问题消失。也许是因为 boost::asio?
- 在 GDB 下运行会在“随机”malloc 处显示 SIGSEGV,这表明我们有一些堆损坏,无法让 malloc 分配新内存。
我已经下载并安装了 dmalloc 并在所有源文件中包含了 dmalloc.h 并传递了标志 -DDMALLOC_FUNC_CHECK (我正在使用 CMake 设置(CMAKE_CXX_FLAGS "-DMALLOC_FUNC_CHECK")。
现在用 dmalloc 替换 malloc 和 free 运行时,程序在 malloc 处终止,我得到以下日志输出
1612369583: 1080: Dmalloc version '5.6.5' from 'http://dmalloc.com/'
1612369583: 1080: flags = 0x4f4e903, logfile 'dmalloc-log'
1612369583: 1080: interval = 10, addr = 0x0, seen # = 0, limit = 0
1612369583: 1080: threads enabled, lock-on = 0, lock-init = 2
1612369583: 1080: starting time = 1612369583
1612369583: 1080: process pid = 23374
1612369583: 1080: WARNING: tried to free(0) from 'unknown'
1612369583: 1082: WARNING: tried to free(0) from 'unknown'
1612369583: 1084: WARNING: tried to free(0) from 'unknown'
1612369583: 1086: WARNING: tried to free(0) from 'unknown'
1612369583: 1088: WARNING: tried to free(0) from 'unknown'
1612369583: 1090: WARNING: tried to free(0) from 'unknown'
1612369583: 1092: WARNING: tried to free(0) from 'unknown'
1612369583: 1095: WARNING: tried to free(0) from 'unknown'
1612369583: 1098: WARNING: tried to free(0) from 'unknown'
1612369583: 1101: WARNING: tried to free(0) from 'unknown'
1612369583: 1104: WARNING: tried to free(0) from 'unknown'
1612369583: 1107: WARNING: tried to free(0) from 'unknown'
1612369587: 1110: error details: checking free pointer
1612369587: 1110: pointer '0x7f541b272e80' from 'unknown' prev access 'unknown'
1612369587: 1110: dump of '0x7f541b272e80'0: '\002\000\2253\177\000\000\001\000\000\000\000\000\000\000\000\337\337\337\337'
1612369587: 1110: ERROR: _dmalloc_chunk_heap_check: free space has been overwritten (err 67)
关于如何获取函数名称和行号而不是“未知”的任何想法?根据包括 dmalloc.h 在内的文档并传递该标志就足够了。此外,我使用 C++ 的事实让我不确定这是否可能。
有没有人能够从该日志中看到任何有用的信息?dmalloc 文档 asys 关于此错误的以下内容:
67 (ERROR_FREE_OVERWRITTEN) 可用空间已被覆盖“如果启用了 free-blank 或 check-blank 令牌,那么当使用“dmalloc-free”字节(十六进制 0xdf,八进制 0337,十进制 223)释放内存时,库将覆盖内存). 如果程序写入此空间,则库将检测写入并触发此错误。这可能表明程序在释放后正在使用指针“
这告诉我 dmalloc 正在检测该内存之前已被释放。但是我没有看到重新分配已释放的堆缓冲区的问题?
非常感谢您的帮助