「メモリダンプを行うプログラムの作成」自体が目的であれば、回答No1.と回答No.2の組み合わせでできますよね。
「デバッグのため、事後にメモリの内容を見たい」ということが目的であれば、自前でメモリを参照しダンプファイルを作成するのはあまり効率が良くありません。DbgHelpライブラリにあるMiniDumpWriteDump()でミニダンプファイルを作成すれば、Visual Studio .NETの統合環境で直接、ソースレベルで変数の内容を確認したり、実行当時のメモリ内容を確認したりできるのでお勧めです。
普段なら「詳細はヘルプを見れば分かります」と書くところなのですが、あまり馴染みのないAPIなのでプログラムを書いてテストしてみました。(インデントは全角空白なのでコピー&ペースト時は注意。)
DWORD WINAPI MinidumpThread(PVOID pv)
{
HANDLE hFile = CreateFile(
"c:\\tmp\\minidump.dmp",
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
MiniDumpWriteDump(
GetCurrentProcess(),
GetCurrentProcessId(),
hFile,
MINIDUMP_TYPE(MiniDumpWithFullMemory | MiniDumpWithHandleData),
NULL,
NULL,
NULL
);
CloseHandle(hFile);
return 0;
}
void CreateMinidump()
{
DWORD dw;
HANDLE hThread = CreateThread(NULL, 0, MinidumpThread, NULL, 0, &dw);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
}
CreateMinidump()を呼ぶとc:\tmp\minidump.dmpを作成します。なぜこういう構造にしてあるのか、エラーチェックはどうやるのか等は、ヘルプを見て自分で考えてください。
CreateMinidump()を呼んでc:\tmp\minidump.dmpが無事に作成されたとします。そうすると、これを使って事後ソースレベルデバッグができます。やり方はこうです。
1. Visual Studio .NETを起動する。
2. ファイル(F)→開く(O)→プロジェクト(P)...でc:\tmp\minidump.dmpを開く。
3. デバッグ(D)→開始(S)でデバッグ開始。この段階で、実行中のプログラムをブレークポイントで止めたのと同じ状態になります。
4. 初回のデバッグ開始時のみソリューションファイルの保存を迫られるので、どこか適当な場所に保存。
5. スレッドペインでCreateMinidump()のスレッドを選択する。シングルスレッドアプリであればCreateMinidump()のスレッド(メインスレッド)とMinidumpThread()のスレッドの2つしかないので探しやすいはず。マルチスレッドの場合は・・・通常のライブデバッグ時と手順は同じですので、根性と常識で探しましょう。
6. 呼び出し履歴ペインでCreateMinidump()を選択する。WaitForSingleObject()で止まっているはず。
7. あとはローカル変数ペインでCreateMinidump()の中のhThreadの値を見るでも、メモリペインで適当なメモリアドレスのメモリの内容を見るでも、はたまたWinMain()まで呼び出し履歴を遡ってlpCmdLineを観察するでも、ご自由にどうぞ。デバッグ(D)→続行(C)以外は何でもできます。(えー、まぁ、「コード変更を適用」とかはできないですな。その辺は常識とヘルプで判断してください。)
8. 最後にデバッグ(D)→デバッグの停止(E)でデバッグを終了。
投稿日時 - 2005-07-18 23:07:36