2016-10-03 21 views
3

もう少し情報を除くミニダンプを作成します。実行時に割り当てられたメモリの範囲

を私はMiniDumpWriteDumpを使用してミニダンプファイルを作成したいが、私は、モジュール内に割り当てられてきた思い出の具体的な範囲を除きます。これらのメモリの範囲はデバッグには重要ではなく、かなり大きくなります(主にテクスチャ)。

私はMiniDumpCallback関数のドキュメントを読んで、InputOutput構造によって提供される情報を調べました。 MiniDumpCallback入力は、実行可能イメージのメモリ範囲を含めるかどうかだけを決定することができ、MiniDumpCallback出力では、ダンプファイルの書き込み範囲を決定できます。

したがって、サイズ制限を超えたいくつかの変数に割り当てられたメモリの範囲を除外してMiniDumpを作成できるかどうかは疑問です。

答えて

0

オペレーティングシステムはメモリをページ(通常4 KB)に割り当てます。ページ全体を除外することは可能です。変数は、ページの途中で開始し、ページの途中で終了する可能性があります。他の変数は、その前後に割り当てることができます。したがって、可変的にメモリを除外することはできません。

変数がページよりも大きく、完全なページにまたがる場合は、完全なページを除外することができます。しかし、これはあなたのコールバックルーチンのためのいくつかの仕事です:

私はかなり大きなサイズの構造体を持つことはないと仮定しましょう。このようなサイズの変数は、配列だけが可能です。配列を割り当て、完全なページにまたがる配列を追跡するメソッドを書くことができます。コールバック中にGetSystemInfo()を使用してページの開始と終了を判断し、そのページを除外できます。

これを実装する努力にもかかわらず、考えてみます。

  • ディスク容量は、最近安いです。数MB以下であれば問題ありません。このような動作を実装するよりもディスクを購入するほうが安いです。
  • クラッシュダンプはかなりよく圧縮されます(少なくとも私が受け取るもの)。あなたがそれを送る必要があるなら、最初にZIPします。
  • これでもまだ十分でない場合は、大きなダンプをミニダンプに変換して(たとえば、WinDbgでダンプを開き、.dumpを再度開く)、最初に解析してください。必要な場合にのみ、顧客は大きなファイルを送信する必要があります。
  • リモートデバッグ。顧客は、例えば、 WinDbgでダンプを開き、デバッグサーバーを起動し、そのサーバーに接続できます。
  • 非常に大きな割り当ての場合、C++ヒープマネージャは、とにかくVirtualAlloc()を直接呼び出します。メモリ領域が512 MBより大きい場合、ProcDumpのようなツールはすでに最大割り当て(-mpスイッチ)を削除することができます。 (ただし、未処理の例外ハンドラがあれば、ProcDumpは機能しません)
関連する問題