私は、20 人余りのコーダー チームの一員として、アプリケーションのメモリ マネージャーを作成しています。メモリ クォータが不足しており、約 700Mb しか使用していないように見えるため、何が起こっているかを確認できる必要があります。フラグメンテーションなど、すべてがどこに向かっているのかを報告できるようにする必要があります。何かアイデアはありますか?
3 に答える
これには既存のメモリ デバッグ ツールを使用できます。Memory Validator 1は非常に便利であることがわかりました。API レベル (ヒープ、新規...) と OS レベル (仮想メモリ) の両方の割り当てを追跡し、仮想メモリ マップを表示できます。
私が非常に便利だと思ったもう 1 つのオプションは、VirtualQuery 関数に基づいて仮想空間全体のマップをダンプできることです。このための私のコードは次のようになります。
void PrintVMMap()
{
size_t start = 0;
// TODO: make portable - not compatible with /3GB, 64b OS or 64b app
size_t end = 1U<<31; // map 32b user space only - kernel space not accessible
SYSTEM_INFO si;
GetSystemInfo(&si);
size_t pageSize = si.dwPageSize;
size_t longestFreeApp = 0;
int index=0;
for (size_t addr = start; addr<end; )
{
MEMORY_BASIC_INFORMATION buffer;
SIZE_T retSize = VirtualQuery((void *)addr,&buffer,sizeof(buffer));
if (retSize==sizeof(buffer) && buffer.RegionSize>0)
{
// dump information about this region
printf(.... some buffer information here ....);
// track longest feee region - usefull fragmentation indicator
if (buffer.State&MEM_FREE)
{
if (buffer.RegionSize>longestFreeApp) longestFreeApp = buffer.RegionSize;
}
addr += buffer.RegionSize;
index+= buffer.RegionSize/pageSize;
}
else
{
// always proceed
addr += pageSize;
index++;
}
}
printf("Longest free VM region: %d",longestFreeApp);
}
ツール ヘルプ API から、Heap32ListFirst/Heap32ListNext を使用してプロセス内のヒープに関する情報、および Module32First/Module32Next を使用してロードされたモジュールに関する情報を見つけることもできます。
「ツール ヘルプ」は Windows 9x で生まれました。Windows NT の元のプロセス情報 API は PSAPI であり、ツール ヘルプと部分的に (完全ではなく) 重複する機能を提供します。
私たちの(巨大な)アプリケーション(Win32ゲーム)は最近「クォータが足りません」という例外をスローし始めました、そして私はすべてのメモリがどこに向かっているのかを見つけることで起訴されました。それは些細な仕事ではありません-この質問とこれは私の最初の発見の試みでした。ヒープの動作は予期しないものであり、使用したクォータの量と使用可能なクォータの量を正確に追跡することは、これまでのところ不可能であることが証明されています。実際、とにかくそれは特に有用な情報ではありません-「クォータ」と「物を置く場所」は微妙にそして迷惑な異なる概念です。ヒープとモジュールを列挙することも便利ですが、受け入れられた答えはそれが得るのと同じくらい良いです。私はMSのDebugDiagを使用して、状況の本当の恐怖を確認しました。