3

Mark Russovich の講演 "Mysteries of Memory Management Revealed" を見たことがある人なら誰でも知っているように、vmmap ツールは、他のほとんどのツールが認識していないように見えるプロセス制限 (vanilla 32 ビット ウィンドウでは 2GB) に対してカウントされるものを表示できます。

実際の合計メモリ サイズ (プロセスの制限に密接に関連するもの)をプログラムで監視できるようにして、少なくともプロセスの制限に近づいたときに何が起こっているかをログに記録できるようにしたいと考えています。vmmap がこれを行う方法について公開されている情報はありますか?

... また、なぜこの情報は入手が難しいのでしょうか??

それについて私が知っていること(AFAIK)では、全体像がわかりません。

  • ::GetProcessMemoryInfo は、プライベート メモリの使用状況に関する情報のみを返すようです
  • System.Diagnostics.Process.VirtualMemorySize64 は、まだ vmmap によって示される合計と完全には一致しないかなり大きな数を返します。
4

2 に答える 2

4

Dependency Walkerを使用して、どの Windows API 関数がインポートされたかを調べたKernel32.dllところvmmap.exe、おそらく関連する次の関数が見つかりました。

VirtualAlloc
VirtualAllocEx
VirtualFree
VirtualProtectEx
VirtualQueryEx

それらを見て、何vmmapが行われているかを確認してください。もちろん、動的に (つまり を介してLoadLibrary) 行われたその他の API 呼び出しは、依存関係ウォーカーには表示されません。また、並列ロードされた DLL を処理するときに壊れることも知られています。

于 2013-05-03T19:14:44.600 に答える
3

twpol/vmmapには、VMMapに似た機能のオープンソース コマンドライン実装があり、SysInternals VMMap が実行するプロセスに関する同じ情報をすべて正常に表示します。

高速ヒープ列挙を実装するこのフォークも参照してください。ただし、私はこれを個人的にテストしていません。

于 2018-10-02T21:54:11.820 に答える