如果启用了页堆和/或应用程序验证程序,HeapWalk()将失败

时间:2012-07-26 17:14:47

标签: c++ windows debugging heap

也许有人在这里可以阐明为什么会出现这种情况或者在应用程序中用于调试堆的其他调用。如果事实证明没有办法让Page Heap和/或Application Verifier与使用HeapWalk()的应用程序一起工作并且没有替换 - 至少我可以停止寻找一个:)

因此,对于那些在这个问题上永远不会一起玩的有更多经验的人的确认将会受到赞赏。

关于HeapWalk()的文档中没有任何内容我可以找到提到页面堆/应用程序验证程序的问题或建议替换此用例。

考虑下面的小样本代码:

如果代码“按原样”执行,它将按预期工作。如果我打开Page Heap或Application Verifier(或两者),则对HeapWalk()的调用将失败。在这种情况下,GetLastError()返回的错误代码始终为0x00000001,对于Microsoft文档而言,该错误代码为“ERROR_INVALID_FUNCTION”。

该问题的潜在动机:

使用自定义堆管理跟踪遗留应用程序中的堆损坏和潜在内存泄漏。使用Page Heap和/或Application Verifier运行旨在为此提供帮助。

感谢您阅读此内容,并欢迎任何可以解决该问题的评论。

#include <Windows.h>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <string>

size_t DummyHeapWalk(void* heapHandle)
{
    size_t commitSize = 0;
    PROCESS_HEAP_ENTRY processHeapEntry;

    processHeapEntry.lpData = 0;

    HeapLock(heapHandle);

    if (HeapWalk(heapHandle, &processHeapEntry))
    {
        commitSize = processHeapEntry.Region.dwCommittedSize;
    }
    else
    {
        int lastError = GetLastError();
        std::ostringstream errorMsg;
        errorMsg << "DummyHeapWalk failed on heapHandle [0x" << std::setfill('0') << std::setw(16) << std::hex << (size_t)(heapHandle) << "] last error: " << lastError << std::endl;
        OutputDebugString(errorMsg.str().c_str());
        DebugBreak();
    }

    HeapUnlock(heapHandle);

    return commitSize;
}

int main(void)
{
    HANDLE myProcess = GetProcessHeap();    

    std::cout << "Process Heap Commit size: " << DummyHeapWalk(myProcess) << std::endl;

    return 0;
}

0 个答案:

没有答案