1

我正在使用 Windows 10 应用程序验证程序,x64 版本 10.0.10586。它勾选了所有“基本”复选框,包括“泄漏”。奇怪的是,应用程序验证程序正在为内存实现一个页面保护堆,因为 malloc 调用在页面末尾返回内存。

DLL 代码:

extern "C" __declspec(dllexport) void LeakMemory()
{
    malloc(1);
    VirtualAlloc(nullptr, 4096, MEM_COMMIT, PAGE_READWRITE);
}

主要代码:

#include <Windows.h>
#include <crtdbg.h>

int main(int, char**)
{
    //_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

    HMODULE h = LoadLibraryW(L"DLLProject.dll");
    void(*pLeakMemory)() = reinterpret_cast<void(*)()>(GetProcAddress(h, "LeakMemory"));
    pLeakMemory();
    FreeLibrary(h);

    printf("bye\n");
    return 0;
}

输出如下:

Page heap: pid 0xFE8: page heap enabled with flags 0x3.
AVRF: ConsoleApplication4.exe: pid 0xFE8: flags 0x81643027: application verifier enabled
bye
The program '[11172] TestProject.exe' has exited with code 0 (0x0).

应用验证程序未能报告任何一个泄漏。

如果我启用 _CrtDbgFlag 调用,然后通过在应用程序关闭时打印它来验证实际上 malloc 是否泄漏:

Detected memory leaks!
Dumping objects ->
{74} normal block at 0x0000015C0979EFF0, 1 bytes long.
 Data: < > CD 
Object dump complete.

为什么应用程序验证器不起作用?如果我在 main() 而不是 DLL 中分配内存,它也无法找到泄漏,但我认为这是它的一个已知限制。

4

0 回答 0