あなたは、JITデバッグを知っておく必要があります

-あなたはダンプファイルが何であるかを知らない場合は、ファイルをダンプする際に知っていない、シリーズのダンプ・ファイルの最初の記事を参照してください。ダンプ・ファイル・ノウ

序文

私はクロールダンプNツールの種類に知っておく必要があります  簡単なツールの使用を導入し、ツールこの記事を、いくつかのダンプファイルを取得することができます。あなたが、覚えていれば私は知らない管理者権限で実行するためにprocdump -i登録することができprocdump死後のデバッガのため。あなたは、実装の原理を理解していますか?今日では、その謎を解明するために一緒に私たちをみましょう。

約束

JIT DebuggerJust In Time DebuggerJIT 调试器Postmortem Debugger事后调试器、私は同じ概念を参照してください- 死後のデバッガを場合はDebugger交換しDebugging、表現死後デバッグを私は時々言うJIT 调试器時々言う、事后调试器私たちは私の混乱の文言によって混同してはならないこと。

原則問い合わせ

実行process monitor、モニターを開きます。次に実行するには、管理者権限でprocdump.exe -i、成功し、監視を停止します。皆を容易にするために、私は意図的に見るために開くために、ジュニアパートナー興味缶ポイントを全体のプロセスを記録したが、私はすべての後、あなたが個人的にそれについて実際の取得することを示唆しています纸上来的终觉浅, 绝知此事要躬行

JITデバッガとしてインストール照会プロセスprocdump

あなたがビデオを見ていなかった場合は、(予約が濾過後の私のショットの直接の結果を参照することができResultている場合、非レジストリ関連のイベントを除きます):Success注册表

私は黄色と赤で強調表示procdumpのレジストリキー操作。あなたは図からどんな結論を出すのですか?

  • procdumpそれはまた書きますHKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebugHKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebugレジストリエントリ。

    中にいることを私はパートナーシップ子ノウハウの開発にはほとんど経験があると信じて64次のビットシステムでは、いくつかのレジストリキーが2つのセットを持っている:セットが利用可能である64セットのためにある使用(黄色のハイライト)ビットプロセス32のプロセスによって使用されている赤色のビットで強調表示します(一部でWow6432Node)。

  • 場合はAeDebugAutoの子とDebugger子の値を持っている、procdumpそれがアップに戻って、その後、変更します。(実行procdump -u時間は、元のシステム設定を復元します)

  • Autoそして、Debuggerデータの種類がありますREG_SZ(私たちが見てきたが、Auto値があります1

  • 私は、推測32バンドが使用する際にビットプロセスがクラッシュしたWow6432Nodeレジストリキーを、64ビットプロセスがクラッシュしたときにせずに使用しWow6432Nodeたレジストリキー。それは本当にですか?あなたはそれを検証する方法を知っていますか?私はあなたが確認するために巧妙な方法を考え出すことができるようになりますと信じています。

実際には、これらに結論procdump -i結果の出力は、(バックアップ操作に加えて)プロンプトを与えられています。黄色と赤の部分は数字を見に強調されていることに注意してください。

procdump-I

ヒント:

あなたのセットが失敗した場合、一部のウイルス対策ソフトウェアは、それがウイルス対策ソフトウェアによって引き起こされているかどうかをチェックし、このレジストリキーを保護することができます。

これまでのところ、我々はそれを知ってprocdump設定することにより、AeDebugAutoDebugger子どもの実現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ダンプファイルを保存するには、次のプロンプトが表示されるはずです。

procdump 在转储文件中添加的注释

我们可以根据提示,输入.jdinfo 0x1afd59e0000 来查看异常来源及上下文信息。

jdinfo 结果

说明:

在运行 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 的话,表示仅对当前用户有效,其它用户不受影响,修改的是 HKCUHKEY_CURRENT_USER)下对应的注册表项。如果为 TRUE 的话,表示对所有用户都生效,修改的是 HKLMHKEY_LOCAL_MACHINE)下对应的注册表项,为 TRUE 的时候,需要有管理员权限。

注意:

如果你手动调用代码操作注册表的话,务必注意 64 位系统下的注册表重定向问题。相信一定有小伙伴儿和我一样踩过这个坑。

JIT 调试的运作机制

整个运作机制,在张银奎张老师的《软件调试》(第一版)第 12 章:未处理异常和 JIT 调试 中做了非常非常详细的介绍。我就不摘录了,感兴趣的小伙伴一定要好好多读几遍。

AeDebug 中的 Ae 是什么意思?

AeDebug中的 Debug 很好理解,就是调试的意思。那 Ae 代表什么意义呢?有人说 AeDebugAuto Exception Debug 的缩写,听上去挺有道理的。偶然的机会,google 到了 Ramond Chen写的一篇文章 —— What does the “Ae” stand for in AeDebug?[3]。根据他的说法,Ae 表示 Application Error 的意思。我把原文截取如下,方便大家阅读。

Raymond-Chen-explain-AE

知道 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

猜你喜欢:

转储文件系列:

转储文件知多少

你需要知道的 N 种抓取 dump 的工具

你生成的转储文件有问题吗?

调试系列:

调试实战——你知道怎么使用DebugView查看调试信息吗?

调试实战——程序CPU占用率飙升,你知道如何快速定位吗?

调试实战——崩溃在ComFriendlyWaitMtaThreadProc

调试实战——使用windbg调试崩溃在ole32!CStdMarshal::DisconnectSrvIPIDs

调试实战——调试PInvoke导致的内存破坏

调试实战——调试excel启动时死锁

调试实战——调试DLL卸载时的死锁

调试实战——调试TerminateThread导致的死锁

排错系列:

排错实战——VS清空最近打开的工程记录

排错实战——拯救加载调试符号失败的IDA

排错实战——你知道拖动窗口时只显示虚框怎么设置吗?

排错实战——解决Tekla通过.tsep安装插件失败的问题

排错实战——使用process explorer替换任务管理器

排错实战——通过对比分析sysinternals事件修复程序功能异常

欢迎留言交流

发布了1535 篇原创文章 · 获赞 586 · 访问量 237万+

おすすめ

転載: blog.csdn.net/sD7O95O/article/details/104057716
おすすめ