问题标签 [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.

0 投票
0 回答
87 浏览

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 正在检测该内存之前已被释放。但是我没有看到重新分配已释放的堆缓冲区的问题?

非常感谢您的帮助

0 投票
1 回答
41 浏览

c - 双重自由运动没有达到预期的效果

我正在阅读 Robert C. Seacord 的《Effective C》一书。在本书中,它有一个练习,您可以有意地双重释放指针,以便您可以使用 dmalloc 进行测试以调试原因。但是,它并没有像预期的那样失败。

这里很清楚*errmsg应该被释放两次:首先是usage函数传递给它时,然后是 in 之后main。为什么在没有参数的情况下运行时不会失败?我正在使用带有 GCC 9.3.0 的 linux (POP!_OS 20.04)。

编辑:有关更多上下文,本书建议我应该看到这样的输出:

添加更多免费电话也无济于事。我得到了使用部分,但没有得到核心转储。

0 投票
1 回答
95 浏览

c++ - 使用'printf'和'fgetc'时,dmalloc输出“未释放:'0x7f2e20d36808|s1'(1182字节)来自'unknown'”

我们一直在使用dmalloc我们的工具集来验证我们的核心库是否没有内存泄漏。但是,最近我们发现使用printforfgetc会导致 dmalloc 在 dmalloc.log 中抛出以下警告。

为了演示这个问题,下面是一个我们用来重现错误的非常简单的程序:

编译程序:

运行,我得到以下结果:

删除fgetc我只收到一个警告,内存没有被释放。

删除printf然后我得到:

这里使用的gcc版本是 9.3.0,dmalloc 是 5.5.2,当使用他们的包管理器安装时,它是最新的 Linux 发行版附带的。

如果这是一个已知问题,或者我在这里缺少一些明显的设置,任何有经验的人都dmalloc可以指出我吗?dmalloc

更新

  1. 编译时也会出现这种情况g++
  2. 有人指出库 5.5.2 已经很老了。我已经构建了最新版本 5.6.5 并使用 gcc 11.2.0 进行了测试,但问题仍然存在。
  1. 添加了 dmalloc 引发的问题的链接。看这里