-あなたはダンプファイルが何であるかを知らない場合は、ファイルをダンプする際に知っていない、シリーズのダンプ・ファイルの最初の記事を参照してください。ダンプ・ファイル・ノウ。
序文
私はクロールダンプNツールの種類に知っておく必要があります 簡単なツールの使用を導入し、ツールこの記事を、いくつかのダンプファイルを取得することができます。あなたが、覚えていれば私は知らない管理者権限で実行するためにprocdump -i
登録することができprocdump
死後のデバッガのため。あなたは、実装の原理を理解していますか?今日では、その謎を解明するために一緒に私たちをみましょう。
約束
JIT Debugger
、Just In Time Debugger
、JIT 调试器
、Postmortem Debugger
、事后调试器
、私は同じ概念を参照してください- 死後のデバッガを。場合はDebugger
交換しDebugging
、表現死後デバッグを。私は時々言うJIT 调试器
時々言う、事后调试器
私たちは私の混乱の文言によって混同してはならないこと。
原則問い合わせ
実行process monitor
、モニターを開きます。次に実行するには、管理者権限でprocdump.exe -i
、成功し、監視を停止します。皆を容易にするために、私は意図的に見るために開くために、ジュニアパートナー興味缶ポイントを全体のプロセスを記録したが、私はすべての後、あなたが個人的にそれについて実際の取得することを示唆しています纸上来的终觉浅, 绝知此事要躬行
。
JITデバッガとしてインストール照会プロセスprocdump
あなたがビデオを見ていなかった場合は、(予約が濾過後の私のショットの直接の結果を参照することができResult
ている場合、非レジストリ関連のイベントを除きます):Success
注册表
写
私は黄色と赤で強調表示procdump
のレジストリキー操作。あなたは図からどんな結論を出すのですか?
procdump
それはまた書きますHKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug
とHKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug
レジストリエントリ。中にいることを私はパートナーシップ子ノウハウの開発にはほとんど経験があると信じて
64
次のビットシステムでは、いくつかのレジストリキーが2つのセットを持っている:セットが利用可能である64
セットのためにある使用(黄色のハイライト)ビットプロセス32
のプロセスによって使用されている赤色のビットで強調表示します(一部でWow6432Node
)。場合は
AeDebug
下Auto
の子とDebugger
子の値を持っている、procdump
それがアップに戻って、その後、変更します。(実行procdump -u
時間は、元のシステム設定を復元します)Auto
そして、Debugger
データの種類がありますREG_SZ
。(私たちが見てきたが、Auto
値があります1
)私は、推測
32
バンドが使用する際にビットプロセスがクラッシュしたWow6432Node
レジストリキーを、64
ビットプロセスがクラッシュしたときにせずに使用しWow6432Node
たレジストリキー。それは本当にですか?あなたはそれを検証する方法を知っていますか?私はあなたが確認するために巧妙な方法を考え出すことができるようになりますと信じています。
実際には、これらに結論procdump -i
結果の出力は、(バックアップ操作に加えて)プロンプトを与えられています。黄色と赤の部分は数字を見に強調されていることに注意してください。
ヒント:
あなたのセットが失敗した場合、一部のウイルス対策ソフトウェアは、それがウイルス対策ソフトウェアによって引き起こされているかどうかをチェックし、このレジストリキーを保護することができます。
これまでのところ、我々はそれを知ってprocdump
設定することにより、AeDebug
中Auto
とDebugger
子どもの実現JIT Debugging
。したがって、これらの二つは、使用は、それが何ですか?
AeDebug問い合わせ
使用しgoogle
た検索をAeDebug
、検索にMicrosoftの公式な説明[1] 、小さな相手に興味を持っている、貴重な情報をたくさん読まなければなりません。
Auto
アイテム:値ならば、ユーザーにエラーメッセージボックスを表示するかどうかを指定し"0"
、メッセージボックスが表示されます。以下のために"1"
プロンプトボックス、ターゲットプロセスに追加の死後デバッガの直接登録を表示されません。Debugger
アイテム:指定死後のデバッガパス、およびその後のデバッガに渡されたパラメータ。私たちは、ことが判明しprocdump -i
、パラメータの設定があります-accepteula -j "E:\dumps" %ld %ld %p
。どこで:-accepteula
ユーザ使用許諾契約を受け入れました。-j
それは向いてパラメータを表し、JIT_DEBUG_INFO
(親が渡されるポインタを%p
対応するコンテンツを)。"E:\dumps"
表現保存したファイルのパスが(実行中の場合はprocdump -i
時間を、ダンプファイルを保存するパスがないが指定され、デフォルトでは現在のパスがかかります)。最初の
%ld
表現のターゲットプロセスID
。第二は、
%ld
イベントハンドラを表します。このイベントハンドラはされWER
、ポストデバッガにコピーされました。死後のデバッガが(でイベントを有効にした場合SetEvent()
、ポスト)、WER
我々は終了し、死後のデバッガを待たずに、ターゲット・プロセスの実行を継続します。死後のデバッガがイベントを起動することなく終了した場合、WER
我々は、ターゲット・プロセスに関する情報を収集していきます。%p
ターゲットプロセススペースにJIT_DEBUG_INFO
構造体のポインタ。これは、例外処理要因とコンテキスト情報関連の例外が含まれています。
ダンプファイルが保存されている場合はJIT_DEBUG_INFO
使用し、windbg
デバッグ、あなたがすることができ.jdinfo address
、例外が発生したときに情報を表示します。使用たとえば、windbg
オープンは、procdump
ダンプファイルを保存するには、次のプロンプトが表示されるはずです。
我们可以根据提示,输入.jdinfo 0x1afd59e0000
来查看异常来源及上下文信息。
说明:
在运行
procdump -i
的时候,如果没有指定转储选项,会默认使用-mm
选项。该选项只包含Process, Thread, Module, Handle and Address Space info.
信息,不会包含%p
对应的内存数据。如果我们在调试 使用-mm
选项保存的转储文件的时候执行.jdinfo address
,会得到如下错误:Unable to process JIT_DEBUG_INFO, Win32 error 0n30
我们可以简单的通过指定
-ma
或-mp
来生成包含内存数据的转储文件,这样我们在调试器里执行.jdinfo address
的时候就不会报错了。据我观察,对于
procdump
来说-j
和%p
选项需要同时传递,缺一不可。
排除进程
如果我们真的不想让某些进程出现未处理异常的时候中断到 JIT
调试器中,有没有办法呢?从 vista
开始,我们可以显示排除某些进程,不让这些进程在出现未处理异常的时候中断到 JIT
调试器中。对应的注册表项如下:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\AutoExclusionList
下面是我机器上的该注册表项的值:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\AutoExclusionList]
"DWM.exe"=dword:00000001
"demo.exe"=dword:00000001
上面的 demo.exe
是我为了测试手动添加的,而 DWM.exe
是系统添加的。windows
为什么要默认把 DWM.exe
添加到排除列表呢?我也不太清楚,不过我在 Excluding an Application from Automatic Debugging[2] 看到这样一句话:
By default, the Desktop Window Manager (Dwm.exe) is excluded from automatic debugging because otherwise a system deadlock can occur if Dwm.exe stops responding (the user cannot see the interface displayed by the debugger because Dwm.exe isn't responding, and Dwm.exe cannot terminate because it is held by the debugger).
我想这就是 DWM.exe
会被排除的原因吧。
如果想通过代码的形式实现,除了直接操作注册表外,还可以通过 WerAddExcludedApplication()
来实现,对应的,可以通过 WerRemoveExcludedApplication()
来删除 。这两个函数的原型摘录如下:
HRESULT WerAddExcludedApplication(
PCWSTR pwzExeName,
BOOL bAllUsers
);
HRESULT WerRemoveExcludedApplication(
PCWSTR pwzExeName,
BOOL bAllUsers
);
第一个参数 pwzExeName
表示要排除的程序,不要带路径,只传递程序名称即可。比如,demo.exe
。
第二个参数 bAllUsers
如果是 FALSE
的话,表示仅对当前用户有效,其它用户不受影响,修改的是 HKCU
(HKEY_CURRENT_USER
)下对应的注册表项。如果为 TRUE
的话,表示对所有用户都生效,修改的是 HKLM
(HKEY_LOCAL_MACHINE
)下对应的注册表项,为 TRUE
的时候,需要有管理员权限。
注意:
如果你手动调用代码操作注册表的话,务必注意
64
位系统下的注册表重定向问题。相信一定有小伙伴儿和我一样踩过这个坑。
JIT 调试的运作机制
整个运作机制,在张银奎张老师的《软件调试》(第一版)第 12 章:未处理异常和 JIT 调试 中做了非常非常详细的介绍。我就不摘录了,感兴趣的小伙伴一定要好好多读几遍。
AeDebug 中的 Ae 是什么意思?
AeDebug
中的 Debug
很好理解,就是调试的意思。那 Ae
代表什么意义呢?有人说 AeDebug
是 Auto Exception Debug
的缩写,听上去挺有道理的。偶然的机会,google
到了 Ramond Chen
写的一篇文章 —— What does the “Ae” stand for in AeDebug?[3]。根据他的说法,Ae
表示 Application Error
的意思。我把原文截取如下,方便大家阅读。
知道 AeDebug
是什么单词的缩写有助于帮助大家记忆,但没必要纠结。
总结
一般情况下,修改
HKLM
下的注册表项需要管理员权限。注册为
JIT
调试器,需要管理员权限,因为需要写HKLM
下的子键。procdump
可以通过-i
选项注册为事后调试器,另外windbg
也可以通过-I
选项注册为事后调试器。AeDebug
注册表项是JIT
调试的关键,该注册项在64
位系统下有对32
位进程和64
位进程分别有对应的注册表项。其中,带Wow6432Node
的注册表项是给32
位目标进程使用的。64
位系统下,除了AeDebug
有两套,还有很多其它注册表项也有两套。如果确实不希望自己的进程在出现未处理异常时中断到
JIT
调试器中,可以设置注册表进行排除(Vista
及之后的操作系统才支持)。
参考资料
《windows sysinternals 实战指南》
《软件调试》(第一版)
Microsoft Document : Enabling Postmortem Debugging[4]
Raymond-Chen : What does the “Ae” stand for in AeDebug?[5]
Configuring Automatic Debugging[6]
WerAddExcludedApplication[7]
WerRemoveExcludedApplication[8]
References:
[1]
微软的官方说明: https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/enabling-postmortem-debugging
[2]Excluding an Application from Automatic Debugging: https://docs.microsoft.com/en-us/windows/win32/debug/configuring-automatic-debugging#excluding-an-application-from-automatic-debugging
[3]What does the “Ae” stand for in AeDebug?: https://devblogs.microsoft.com/oldnewthing/20181017-00/?p=99995
[4]Microsoft Document : Enabling Postmortem Debugging: https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/enabling-postmortem-debugging
[5]Raymond-Chen : What does the “Ae” stand for in AeDebug?: https://devblogs.microsoft.com/oldnewthing/20181017-00/?p=99995
[6]Configuring Automatic Debugging: https://docs.microsoft.com/en-us/windows/win32/debug/configuring-automatic-debugging#configuring-automatic-debugging-for-application-crashes
[7]WerAddExcludedApplication: https://docs.microsoft.com/en-us/windows/win32/api/werapi/nf-werapi-weraddexcludedapplication
[8]WerRemoveExcludedApplication: https://docs.microsoft.com/en-us/windows/win32/api/werapi/nf-werapi-werremoveexcludedapplication
猜你喜欢:
转储文件系列:
调试系列:
调试实战——你知道怎么使用DebugView查看调试信息吗?
调试实战——崩溃在ComFriendlyWaitMtaThreadProc
调试实战——使用windbg调试崩溃在ole32!CStdMarshal::DisconnectSrvIPIDs
排错系列:
排错实战——使用process explorer替换任务管理器
排错实战——通过对比分析sysinternals事件修复程序功能异常
欢迎留言交流