2

たぶん、ここにいる誰かが、なぜそうなのか、またはアプリケーションでのデバッグ目的でヒープをウォークするために使用する他の呼び出しに光を当てることができます. HeapWalk() を使用するアプリケーションで Page Heap や Application Verifier を動作させる方法がなく、代替手段がないことが判明した場合、少なくとも私はそれを探すのをやめることができます :)

したがって、これらが決して一緒にプレイされることは決してないという問題について、より多くの経験を持つ人々からの確認をいただければ幸いです.

HeapWalk() に関するドキュメントには、Page Heap / Application Verifier の問題について言及したり、このユース ケースの代替案を提案したりするものはありません。

以下の小さなサンプルコードを検討してください。

コードを「そのまま」実行すると、期待どおりに動作します。ページ ヒープまたはアプリケーション検証ツール (またはその両方) をオンにすると、HeapWalk() の呼び出しが失敗します。この場合、GetLastError() によって返されるエラー コードは常に 0x00000001 であり、Microsoft のドキュメントに関しては「ERROR_INVALID_FUNCTION」です。

質問の根底にある動機:

カスタム ヒープ管理を使用して、レガシー アプリケーションのヒープの破損と潜在的なメモリ リークを追跡します。ページ ヒープおよび/またはアプリケーション検証ツールを使用して実行することは、それを支援することを目的としていました。

これを読んでくれてありがとう。この問題に光を当てることができるコメントは大歓迎です。

#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;
}
4

0 に答える 0