6

質問は少し厄介かもしれませんが、ここに私の詳細な問題があります:

現在、SysInternals の procdump.exeをセットアップして、偽の消失を示すアプリケーションを監視するように検討しています。つまり、ユーザーは、アプリケーションの短い目に見えるハングの後、アプリケーションがトレースなしで単に「なくなった」と報告しています。窓。

私の最初のアイデアはprocdump -e -x . MyApp.exe、アプリケーションが未処理の例外に遭遇したときにクラッシュ ダンプを記録する実行することでしたが、その後、-tスイッチもあることがわかりました。

-t - プロセスの終了時にダンプを書き込みます。

プロセスが終了すると、自動的にダンプが生成されます。

今問題

-t スイッチをトリガーできる定義済みの場所にExitProcessor呼び出しを挿入して、アプリでスイッチをテストしました。TerminateProcess

アプリは期待どおりに動作しますが、つまりTerminateProcess、実行中のアプリをすぐに「強制終了」し、ExitProcessグローバル クリーンアップが実行されるためしばらく時間がかかりますが、この方法で生成されたダンプはどちらの場合も役に立ちません。

私が取得するダンプには、-t常に単一のスレッド (アプリケーションが終了時に 20 を超えるスレッドを実行していた場所) のみが含まれており、コールスタックは有用な場所にさえありません。(終了したアプリからの 1 つのランダムなスレッドのようです。)

私は何か間違ったことをしていますか?procdump -tプロセス終了関数の予期しない呼び出しを追跡するために使用できますか?

4

1 に答える 1

4

procdump -t を使用して、プロセス終了関数の予期しない呼び出しを追跡できますか?

私はそうではないと思いますが、その理由は次のとおりです。 test process calc.exe

CommandLine: "C:\Program Files\Sysinternals\procdump.exe" -t calc.exe

procdump が calc.exe プロセス ハンドルを待機していることを慎重に示唆するようにしています。

0:000> kb
ChildEBP RetAddr  Args to Child              
0017f2e0 77135e6c 75336872 00000002 0017f334 ntdll!KiFastSystemCallRet
0017f2e4 75336872 00000002 0017f334 00000001 ntdll!NtWaitForMultipleObjects+0xc
0017f380 76cbf14a 0017f334 0017f3a8 00000000 KERNELBASE!WaitForMultipleObjectsEx+0x100
0017f3c8 76cbf2c2 00000002 7ffdb000 00000000 kernel32!WaitForMultipleObjectsExImplementation+0xe0
0017f3e4 011c6135 00000002 0017f46c 00000000 kernel32!WaitForMultipleObjects+0x18
WARNING: Stack unwind information not available. Following frames may be wrong.
0017fc30 011c999e 00000003 013d1de0 013d1e78 procdump+0x6135
0017fc78 76cc1194 7ffdb000 0017fcc4 7714b495 procdump+0x999e
0017fc84 7714b495 7ffdb000 77ad79b5 00000000 kernel32!BaseThreadInitThunk+0xe
0017fcc4 7714b468 011c99f5 7ffdb000 00000000 ntdll!__RtlUserThreadStart+0x70
0017fcdc 00000000 011c99f5 7ffdb000 00000000 ntdll!_RtlUserThreadStart+0x1b
0:000> dd 17f46c
0017f46c  00000238 00000268
0:000> !handle 238 f
Handle 238
  Type          Process
  Attributes    0
  GrantedAccess 0x1fffff:
         Delete,ReadControl,WriteDac,WriteOwner,Synch
         Terminate,CreateThread,,VMOp,VMRead,VMWrite,DupHandle,CreateProcess,SetQuota,SetInfo,QueryInfo,SetPort
  HandleCount   5
  PointerCount  52
  Name          <none>
  Object Specific Information
    Process Id  1580
    Parent Process  2476
    Base Priority 8

ここに画像の説明を入力

クラッシュ ダンプ ファイルでは、プロセスの終了直前に最後に完了したプロセス スレッド (TID 3136) のスタックが取得されます。

0:000> ~
.  0  Id: dc8.c40 Suspend: -1 Teb: 7ffdd000 Unfrozen
0:000> .formats c40
Evaluate expression:
  Hex:     00000c40
  Decimal: 3136

ここに画像の説明を入力

クラッシュ ダンプ ファイルは、最後のスレッドの完了後、プロセスの終了前に作成されます。

ここに画像の説明を入力

于 2013-01-14T19:36:11.173 に答える