• ベストアンサー

メモリ内をトレースログに吐きたい

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

質問者が選んだベストアンサー

  • ベストアンサー
  • hope10
  • ベストアンサー率48% (17/35)
回答No.2

所謂ダンプリストの作成方法が判らない、と言う事ですよね。 検索すればいくらでも引っ掛かると思いますが、とりあえずソースが有りそうなのを...

参考URL:
http://www.m-net.ne.jp/~takagih/software/dump.html
全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.3

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

全文を見る
すると、全ての回答が全文表示されます。
  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.1

windowsですよね? 自プロセスのメモリ空間でしたら、直接ポインタにアドレスを書き込んで、アクセスしても大丈夫だとおもいます。(もちろん、論理的に確保されていないorアクセスが許可されていないメモリブロックにアクセスするとアクセスバイオレーションエラーが発生します。) もっと行儀よく、自プロセスのメモリをみたい、とか、他プロセスのメモリを見たいと思うなら、 ・VirtualAllocEx (WinNT以降) ・ReadProcessMemory といったAPIを調べられるとよいです。

real_neo
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • windows10visualstudio2010

    windows10でvisualstudio2010を使って、.net4のアプリを作成しています。 win10には.NET Framework 4.7.2がはいってますが、デバッグした場合、.net4で動作することになりますか?

  • DXライブラリで作ったソフトが表示されない

    visualstudio2012でDXライブラリを使ってアクションゲームを作りました。 しかしvisualstudioでデバッグをして起動するとゲームができるんですが、ビルトをしてexeファイルを作りそれをダブルクリックして実行してもウィンドウの中に黒い画面が表示されるだけでそのまま何も動かない状態になってしまいます なぜでしょうか? 急いでいます。わかる方がいたら回答お願いします!!

  • メモリリークを調べています。

    メモリリークを調べています。 MFC(VC2005)です。 MFC拡張DLLで作成したアプリケーションにメモリリークがないかを調査し始めたのですが、VisualStudioでデバッグでは 「Detected memory leaks!」は出ません。 パフォーマンスモニタで、このDLLを静的リンクしたEXEのPrivateByteを約90時間監視すると、2回だけ大きな上昇(といっても数10KB)が見られました。 上昇するまでは横ばいですが、この横ばいの時間が2回とも異なります。 これはメモリリークと言えるのでしょうか? ちなみに、このDLLの調査対象機能は画像描画機能で、定期的にメモリ確保→メモリ解放を繰り返します。 メモリリークでないとしたら、どう結論付けたら良いでしょうか? 解決方法はありますか? 私としてはフラグメンテーションを疑っています。

  • fopen/fcloseでメモリリーク?

    Linux2.4系です。 Cプログラムでログファイルをフラッシュドライブ上のファイルに書き足していく処理があり、 デバッグテストで処理を高速に繰り返しながらコマンドラインのfreeコマンドでメモリ残量を 確認すると、かなり速いペースでキャッシュが減ります。 原因と対処法をご存じの方、おられないでしょうか? 処理は概ね以下のような感じです。 FILE *log_file; log_file = fopen( "../log/0001.txt" , "a+" ); fwrite( &text1, 1, sizeof(text1), log_file ); fclose( log_file ); 頻度は毎秒3回くらいで書き足すテキストは1kバイト程度です。 fwrite()を止めてもメモリ減少は止まらないですが、fopenとfclose を止めると減少しなくなります。

  • USBメモリが読み取れません・・。

    困っているのでどなたかお力をお貸し下さい! よろしくお願いします。 USBメモリをさしこむと、「フォーマットされていません、フォーマットしますか?」というログが表示されます。 今まで使っていたのにどうしてでしょうか。 フォーマットしてしまうとデータが消えるようで指示に従えません・・。 ワードとエクセルのデータなのですが、いつもUSBメモリから直接読み込んで、直接書き込んでいたのでPC本体にはデータが残っていません。 このUSBメモリのデータはどうやったら出せるのでしょうか? よろしくお願いします。

  • 仮想メモリが低すぎますって出てしまうんです

    ノートパソなんですが、メインメモリが256MBしかなくてRPGのオンラインゲームすると「仮想メモリが低すぎます」って表示されたんです。 それで、メモリ購入して増やす間 仮想メモリの設定を変えたんです 今日やっと注文してたメモリが来たので 今、自分で入れてみたんです。でもゲームにログ出来ないんです。 マイコンピューターからプロパティ開いて「ページファイルなし」にちゃんとチェックを入れたのに また「仮想メモリが低すぎます」って表示がでちゃうんです。 どこをどう設定したらいいのでしょうか・・・

  • CListView

     いつもお世話になっています。 OS Windows 2000 VC++ 6.0 MFC で、CListView を使ったソフトを書いています。  デバッグ版では、 データファイルを新規作成して、1つだけ データを追加したとき、 1行だけ表示されます。  リリース版にすると、 2行表示されてしまいます。 このファイルを一度閉じてから 再度開くと、 どちらでも正常に1行のみ表示されます。  どんなところに注意して デバッグしたら問題点が発見できるでしょうか? ヒントをいただければ幸いです。 よろしくお願いいたします。

  • 破綻しているdouble値について

    こんにちは。 VisualStudioでプログラムしています。 doubleの計算で破綻してしまったとき、デバッグウィンドウを見ると-1.#IND00と表示されています。 これをASSERTEとして検知することはできますでしょうか?

  • USBメモリにコピー

    画像データをUSBメモリにコピーをしています8GBのUSBメモリで空き容量が1,76GBまだ有るのに「コピーできません。ディレクトリまたはファイルを作成できません」と表示されます、今までスムーズにコピーできていたのに突然出来なくなりました、これはなぜでしょうか。PCはXP、USBメモリはTranscendです。

  • VisualStudio2005で「デバッグ開始」「デバッグなしで開始」がうまくいかない

    VisualStudio2005で開発をしているのですが、 あるときPCが強制終了する際に、開発途中の状態のままVisualStudioも終了してしまいました。 「~を保存しますか」というダイアログがでていたのですが、良く分からず「いいえ」を選択してしまい、次に立ち上げたとき、「デバッグ開始」ボタンを押すと「~がありません」と(~のところはもう覚えていません……)出たのでVisualStudioのexeを指定しました。 以後、「デバッグ開始」「デバッグなしで開始」を押しても、作成中のプログラムを実行してくれず、VisualStudioがもう一つ立ち上がってしまいます。 これを正常にするにはどこの設定をどう変えれば良いのでしょうか?