【发布时间】:2019-07-31 18:41:01
【问题描述】:
我正在使用 _CrtMemCheckpoint 和 _CrtMemDumpAllObjectsSince 来跟踪我的 dll 中可能存在的内存泄漏。
在 DllMain 中,当检测到 DLL_PROCESS_ATTACH 时,会调用一个 init 函数,该函数会在全局 _CrtMemState 变量 startState 上调用 _CrtMemCheckpoint(&startState)。当检测到 DLL_PROCESS_DETACH 时,将调用一个退出函数,该函数调用 _CrtMemDumpAllObjectsSince(&startState)。这返回
ExitInstance()Dumping objects ->
{8706} normal block at 0x07088200, 8 bytes long.
Data: <p v > 70 FF 76 07 01 01 CD CD
{8705} normal block at 0x07084D28, 40 bytes long.
Data: < > 00 00 00 10 FF FF FF FF FF FF FF FF 00 00 00 00
{4577} normal block at 0x070845F0, 40 bytes long.
Data: <dbV > 64 62 56 0F 01 00 00 00 FF FF FF FF FF FF FF FF
{166} normal block at 0x028DD4B8, 40 bytes long.
Data: <dbV > 64 62 56 0F 01 00 00 00 FF FF FF FF FF FF FF FF
{87} normal block at 0x02889BA8, 12 bytes long.
Data: < P > DC 50 90 02 00 00 00 00 01 00 00 00
到目前为止一切顺利,除了最后三个条目(4577、166 和 87)也在 startState 中。 IE。如果我在 Init 函数和 Exit 函数中运行 _CrtDumpMemoryLeaks(),这些条目都在两个列表中。
documentation 是这样说的:
_CrtMemDumpAllObjectsSince 使用 state 参数的值来确定在哪里启动转储操作。从开始倾倒 一个指定的堆状态,状态参数必须是一个指向 _CrtMemState 结构,在调用 _CrtMemDumpAllObjectsSince 之前已由 _CrtMemCheckpoint 填充。
这让我相信 startState 中跟踪的项目将被排除在输出之外。在调用 _CrtMemCheckpoint 的 Init 函数结束时,大约有 4700 次分配调用。 _CrtMemDumpAllObjectsSince 不应该只转储在该检查点调用之后分配的对象吗?
我错过了什么?
【问题讨论】:
-
您是否考虑过只使用LeakSanitizer 而不是尝试手动推出劣质解决方案?
-
哇,不,我没有考虑为我的 Windows DLL 使用 Linux 和 OS X 上支持的 Clang 工具
-
clang sanitizers 可以在 Windows 上使用。
-
我所知道的就是我可以在这里阅读的内容:github.com/google/sanitizers/wiki/AddressSanitizerLeakSanitizer,它非常明确地说明了支持的内容。无论哪种方式,将我现有的项目转换为新工具都不是一件容易的事。
-
只是想帮忙。至于支持不同的工具,这通常是个好主意。在多个平台上使用多个编译器进行构建往往会清除大量错误 :)
标签: c++ c dll memory-leaks