4

デバッグしているアプリケーションに問題があります。定常状態のメモリ使用量は数百メガバイトです。時折(数時間後)、メモリ使用量が数ギガバイトに急増する状態になります。これが発生したらすぐにプログラムを停止できるようにしたいと思います。

制御が自分のコードを通過する場合、次のようなコードで過剰なメモリ使用をトラップできます。

bool usingTooMuchMemory()
{
    PROCESS_MEMORY_COUNTERS pmc;
    if (GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof pmc))
        return pmc.WorkingSetSize > 0x80000000u; // 2GB working set
    return false;
}

適切なポイントでワーキングセットのサイズをテストする必要があるため、これは役に立ちません。私は本当にプログラムが最初に壊れるmallocnew、ワーキングセットまたはヒープサイズがいくつかのしきい値を超えてしまうことを望んでいます。そして理想的には、ライブラリは膨大な数の小さなブロックを割り当てるのが好きなので、最小限のオーバーヘッドでCRTヒープ自体によってこれを実行したいと思います。

疑わしいコードは、呼び出し元のコードによって作成されたスレッドで実行されているDLLにあります。DLLはCRTに静的にリンクし、特別なヒープ管理はありません。DLLのソースコードがあります。

何か案は?明らかな何かが欠けていますか?

4

3 に答える 3

4

_CrtSetAllocHookを使用して、メモリの割り当てと割り当て解除のフックを設定できます。

于 2011-04-07T08:25:20.660 に答える
1

http://msdn.microsoft.com/en-us/library/aa366778%28v=vs.85%29.aspx

VSのリンカオプションでIMAGE_FILE_LARGE_ADDRESS_AWAREフラグをクリアすると、プログラムのヒープのサイズは2GBに制限され、その制限を超えるメモリを取得しようとするとクラッシュするはずです。

于 2011-04-07T12:28:37.340 に答える
1

DetoursライブラリHeapAllocを使用して、malloc が内部的に呼び出す関数をフックできます。

于 2011-04-07T11:57:32.577 に答える