重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

自分で作成しているログファイルに、メモリ内のデータを吐き出したいんですが、やり方がわかりません。
これでは何がやりたいかがよくわからないと思うので、具体例を。
VisualStudioなんかでデバッグしたときに、メモリウィンドウが使えますよね?
そのウィンドウの表示のように吐き出したいんです。

A 回答 (3件)

所謂ダンプリストの作成方法が判らない、と言う事ですよね。


検索すればいくらでも引っ掛かると思いますが、とりあえずソースが有りそうなのを...

参考URL:http://www.m-net.ne.jp/~takagih/software/dump.html
    • good
    • 0

「メモリダンプを行うプログラムの作成」自体が目的であれば、回答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)でデバッグを終了。
    • good
    • 0

windowsですよね?



自プロセスのメモリ空間でしたら、直接ポインタにアドレスを書き込んで、アクセスしても大丈夫だとおもいます。(もちろん、論理的に確保されていないorアクセスが許可されていないメモリブロックにアクセスするとアクセスバイオレーションエラーが発生します。)

もっと行儀よく、自プロセスのメモリをみたい、とか、他プロセスのメモリを見たいと思うなら、
・VirtualAllocEx (WinNT以降)
・ReadProcessMemory
といったAPIを調べられるとよいです。

この回答への補足

すいません。説明が悪かったようで。
中を見るのではなく、メモリの内容をファイルに出力して、後からそのファイルを見たいんです。
出力形式はメモリウィンドウ見たいな感じでです。

補足日時:2005/07/18 17:30
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!