问题标签 [dmalloc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 在日志中获取函数名称和行号
我真的需要帮助来调试一些不断出现的内存损坏错误。一些信息:
- 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 处终止,我得到以下日志输出
关于如何获取函数名称和行号而不是“未知”的任何想法?根据包括 dmalloc.h 在内的文档并传递该标志就足够了。此外,我使用 C++ 的事实让我不确定这是否可能。
有没有人能够从该日志中看到任何有用的信息?dmalloc 文档 asys 关于此错误的以下内容:
67 (ERROR_FREE_OVERWRITTEN) 可用空间已被覆盖“如果启用了 free-blank 或 check-blank 令牌,那么当使用“dmalloc-free”字节(十六进制 0xdf,八进制 0337,十进制 223)释放内存时,库将覆盖内存). 如果程序写入此空间,则库将检测写入并触发此错误。这可能表明程序在释放后正在使用指针“
这告诉我 dmalloc 正在检测该内存之前已被释放。但是我没有看到重新分配已释放的堆缓冲区的问题?
非常感谢您的帮助
c - 双重自由运动没有达到预期的效果
我正在阅读 Robert C. Seacord 的《Effective C》一书。在本书中,它有一个练习,您可以有意地双重释放指针,以便您可以使用 dmalloc 进行测试以调试原因。但是,它并没有像预期的那样失败。
这里很清楚*errmsg
应该被释放两次:首先是usage
函数传递给它时,然后是 in 之后main
。为什么在没有参数的情况下运行时不会失败?我正在使用带有 GCC 9.3.0 的 linux (POP!_OS 20.04)。
编辑:有关更多上下文,本书建议我应该看到这样的输出:
添加更多免费电话也无济于事。我得到了使用部分,但没有得到核心转储。
c++ - 使用'printf'和'fgetc'时,dmalloc输出“未释放:'0x7f2e20d36808|s1'(1182字节)来自'unknown'”
我们一直在使用dmalloc
我们的工具集来验证我们的核心库是否没有内存泄漏。但是,最近我们发现使用printf
orfgetc
会导致 dmalloc 在 dmalloc.log 中抛出以下警告。
为了演示这个问题,下面是一个我们用来重现错误的非常简单的程序:
编译程序:
运行,我得到以下结果:
删除fgetc
我只收到一个警告,内存没有被释放。
删除printf
然后我得到:
这里使用的gcc
版本是 9.3.0,dmalloc 是 5.5.2,当使用他们的包管理器安装时,它是最新的 Linux 发行版附带的。
如果这是一个已知问题,或者我在这里缺少一些明显的设置,任何有经验的人都dmalloc
可以指出我吗?dmalloc
更新
- 编译时也会出现这种情况
g++
。 - 有人指出库 5.5.2 已经很老了。我已经构建了最新版本 5.6.5 并使用 gcc 11.2.0 进行了测试,但问题仍然存在。
- 添加了 dmalloc 引发的问题的链接。看这里