6

MiniDumpWriteDump()APIを使用して、クラッシュしたプロセスBを別のプロセスAからダンプしようとしています。MSDNが次のように言っているため、これを実行しています。

MiniDumpWriteDumpは、ダンプされるターゲットプロセス内からではなく、可能であれば別のプロセスから呼び出す必要があります。

MiniDumpWriteDump()は次のように定義されます。

BOOL WINAPI MiniDumpWriteDump(
  __in  HANDLE hProcess,
  __in  DWORD ProcessId,
  __in  HANDLE hFile,
  __in  MINIDUMP_TYPE DumpType,
  __in  PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
  __in  PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
  __in  PMINIDUMP_CALLBACK_INFORMATION CallbackParam
);

特に、ExceptionParamのタイプはPMINIDUMP_EXCEPTION_INFORMATIONであり、次のように定義されています。

typedef struct _MINIDUMP_EXCEPTION_INFORMATION {
  DWORD               ThreadId;
  PEXCEPTION_POINTERS ExceptionPointers;
  BOOL                ClientPointers;
} MINIDUMP_EXCEPTION_INFORMATION, *PMINIDUMP_EXCEPTION_INFORMATION;

今、私は次の2つのパラメータをどのように準備するのか疑問に思っています。

ThreadId 例外をスローするスレッドの識別子。

ExceptionPointers コンピューターに依存しない例外の説明と例外時のプロセッサーコンテキストを指定するEXCEPTION_POINTERS構造体へのポインター。

プロセスAで実行しているときに、プロセスBで障害のあるスレッドIDと例外ポインターを取得するにはどうすればよいですか?

ありがとう。

4

2 に答える 2

2

ミニダンプが生成される原因となったクライアント例外を記述する MINIDUMP_EXCEPTION_INFORMATION 構造体へのポインター。このパラメーターの値が NULL の場合、ミニダンプ ファイルに例外情報は含まれません。

パラメータがマークされているにもかかわらず、実際にここで NULL を渡すことはでき__inません。__in_optそもそもターゲットプロセスからその情報を取得するには、プロセスがとにかくデバッグする必要があります。

プロセス A がプロセス B のミニダンプを取得することがわかっているのは、いつ、どのようにしてですか? A が実際に B をデバッグしている場合、WaitForDebugEvent が EXCEPTION_DEBUG_EVENT で戻ると、info 構造体で情報を利用できます。

A が B をデバッグしていない場合、おそらく B は何らかの IPC メカニズムを通じて A に「クラッシュしています。ミニダンプを取得してください」と伝えています。この場合、B はダンプ自体を取得するか、同じ IPC メカニズムを介して例外情報を A に渡すことができます。ただし、クラッシュ プロセスで MiniDumpWriteDump を呼び出すのと同じ理由で、これには問題があります。爆破された可能性のあるものは、Aにそれについて伝える必要があるかもしれません.

A が B のダンプを取る可能性があるもう 1 つのメカニズムは、A が JIT デバッガーとしてインストールされることです。この場合、A は B をデバッグし、デバッグ API を使用して例外情報を取得できます。

A が B のミニダンプを定期的に取っているだけの場合、必ずしも例外が発生するわけではないので、この場合は NULL を渡すだけでかまいません。

次のようなことをしようとしている場合は注意してください

WaitForSingleObject(handleToProcessB, INFINITE);
MiniDumpWriteDump(handleToProcessB, ...)

これは機能しません。OS は、ミニダンプを取得するために必要な仮想アドレス空間やスタックではなく、主にプロセスの終了コードなど、ごくわずかなものを保持します。

于 2010-11-13T20:40:24.010 に答える
0

特定のプロセス名の特定の例外で自動ダンプを作成するには、DebugDiag または AdPlus を使用することをお勧めします。これらは、そのように構成できる外部の (そして無料の!) ソフトウェアです。

本当に自分でダンプを書きたい場合は、プロセス B で行うことができます: MSDN は、メモリ不足、スタック オーバーフロー、スタックの破損 (リストは完全ではありません) などの厄介なエラーが発生するため、これはお勧めできません。確かにメモリとスタックを使用するため、ダンプがまったくなくなる可能性があります (そして非常に悪いプロセスクラッシュ)。私の経験からすると、これは非常にまれです (私は非常に負荷の高い分散 C++ ソフトウェアで作業していました)。他の例外については、問題ないはずです。その場合、例外トランスレータ (_set_se_translator を参照) またはベクトル化された例外ハンドラー (AddVectoredContinueHandler を参照) または関数 GetExceptionInformation() を使用して、EXCEPTION_RECORD 構造を取得できます (私が認識していない他の方法があるかもしれません)。

プロセス B で例外が発生した後にプロセス A からダンプを作成するということは、例外に関するすべての情報をコピーし、この例外で何かをダンプする必要があることをプロセス A に警告する必要があることを意味します。これはメモリとスタックを消費するため、前に説明したのと同じ制限があります。

それが役立つことを願っています

于 2010-11-08T14:26:59.207 に答える