共用方式為


.jdinfo (使用JIT_DEBUG_INFO)

.jdinfo 命令會使用 JIT_DEBUG_INFO 結構做為例外狀況和內容的來源,以便及時進行 (JIT) 偵錯。 結構的位址會使用 AeDebug 登錄專案中指定的 %p 參數傳遞至 .jdinfo 命令。

如需所使用登錄機碼的詳細資訊,請參閱 啟用事後偵錯。 如需註冊內容的詳細資訊,請參閱 變更內容

.jdinfo Address 

參數

位址
指定JIT_DEBUG_INFO結構的位址。 結構的位址會使用 AeDebug 登錄專案中指定的 %p 參數傳遞至 .jdinfo 命令。

Environment

模式

使用者模式

目標

即時、損毀傾印

平台

全部

此範例示範如何將 AeDebug 登錄項目設定為使用 WinDbg 做為 JIT 調試程式。

Debugger = "Path\WinDbg.EXE -p %ld -e %ld -c ".jdinfo 0x%p"

然後,噹噹機發生時,會叫用已設定的 JIT 調試程式,並使用 %p 參數將JIT_DEBUG_INFO結構的位址傳遞至 調試程式啟動之後執行的 .jdinfo 命令。

nMicrosoft (R) Windows Debugger Version 10.0.10240.9 AMD64
Copyright (c) Microsoft Corporation. All rights reserved.

*** wait with pending attach
Executable search path is: 
...
ModLoad: 00000000`68a20000 00000000`68ac3000   C:\WINDOWS\WinSxS\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.9247_none_08e394a1a83e212f\MSVCR90.dll
(153c.5d0): Break instruction exception - code 80000003 (first chance)
Processing initial command '.jdinfo 0x00000000003E0000'
ntdll!DbgBreakPoint:
00007ffc`81a986a0 cc              int     3
0:003> .jdinfo 0x00000000003E0000
----- Exception occurred on thread 0:15c8
ntdll!ZwWaitForMultipleObjects+0x14:
00007ffc`81a959a4 c3              ret

----- Exception record at 00000000`003e0028:
ExceptionAddress: 00007ff791d81014 (CrashAV_x64!wmain+0x0000000000000014)
   ExceptionCode: c0000005 (Access violation)
  ExceptionFlags: 00000000
NumberParameters: 2
   Parameter[0]: 0000000000000001
   Parameter[1]: 0000000000000000
Attempt to write to address 0000000000000000

----- Context record at 00000000`003e00c0:
rax=0000000000000000 rbx=0000000000000000 rcx=00007ffc81a954d4
rdx=0000000000000000 rsi=0000000000000000 rdi=0000000000000001
rip=00007ff791d81014 rsp=00000000006ff8b0 rbp=0000000000000000
 r8=00000000006ff808  r9=0000000000000000 r10=0000000000000000
r11=0000000000000000 r12=0000000000000000 r13=0000000000000000
r14=0000000000000000 r15=0000000000000000
iopl=0         nv up ei pl zr na po nc
cs=0033  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010246
CrashAV_x64!wmain+0x14:
00007ff7`91d81014 45891b          mov     dword ptr [r11],r11d ds:00000000`00000000=????????

備註

.jdinfo 命令會使用 Windows Vista 中引進的 AeDebug 登錄資訊。 如需所使用登錄機碼的詳細資訊,請參閱 啟用事後偵錯。 .jdinfo 命令會取得系統為 AeDebug 設定的JIT_DEBUG_INFO位址,並將內容設定為造成損毀的例外狀況。

您可以使用 .jdinfo 命令,而不是 AeDebug 中的 -g,讓您的調試程式設定為 AeDebug 狀態,而不需要執行。

這種狀態可能比較有利,因為在一般情況下,發生使用者模式例外狀況時,會發生下列順序:

  1. Microsoft Windows 作業系統會停止執行應用程式。

  2. 事後調試程式已啟動。

  3. 調試程式會附加至應用程式。

  4. 調試程式會發出 「Go」 命令。 (此命令是由 AeDebug 機碼中的 -g 所造成。

  5. 目標會嘗試執行,而且可能或可能不會遇到相同的例外狀況。

  6. 這個例外狀況會中斷至調試程式。

有數個問題可能會因為下列事件而發生:

  • 例外狀況不一定會重複,可能是因為重新啟動例外狀況時已不存在的暫時性狀況。

  • 可能會發生另一個事件,例如不同的例外狀況。 無法得知它是否與原始事件相同。

  • 附加調試程式牽涉到插入新的線程,如果線程持有載入器鎖定,則可以加以封鎖。 插入新線程可能會對程式造成重大干擾。

如果您在 AeDebug 機碼中使用 -c .jdinfo 而不是 -g,則不會執行。 相反地,使用 %p 變數從 JIT_DEBUG_INFO 結構擷取例外狀況資訊。

例如,請考慮下列 AeDebug 機碼。

ntsd -p %ld -e %ld -c ".jdinfo 0x%p"

下列範例甚至較不具有侵入性。 -pv 參數會導致調試程式以非侵入方式附加,而不會將任何新的線程插入目標中。

ntsd -pv -p %ld -e %ld -c ".jdinfo 0x%p"

如果您使用這個非侵入性選項,結束調試程式並不會結束進程。 您可以使用 .kill (Kill Process) 命令結束進程。

如果您想要將此專案用於傾印檔案偵錯,您應該在建立傾印檔案時,使用 .dump /j 將JIT_DEBUG_INFO結構新增至傾印檔案。

JIT_DEBUG_INFO 結構的定義如下。

typedef struct _JIT_DEBUG_INFO {
    DWORD dwSize;
    DWORD dwProcessorArchitecture;
    DWORD dwThreadID;
    DWORD dwReserved0;
    ULONG64 lpExceptionAddress;
    ULONG64 lpExceptionRecord;
    ULONG64 lpContextRecord;
} JIT_DEBUG_INFO, *LPJIT_DEBUG_INFO;

您可以使用 dt 命令來顯示JIT_DEBUG_INFO結構。

0: kd> dt JIT_DEBUG_INFO
nt!JIT_DEBUG_INFO
   +0x000 dwSize           : Uint4B
   +0x004 dwProcessorArchitecture : Uint4B
   +0x008 dwThreadID       : Uint4B
  +0x00c dwReserved0      : Uint4B
   +0x010 lpExceptionAddress : Uint8B
   +0x018 lpExceptionRecord : Uint8B
   +0x020 lpContextRecord  : Uint8B

使用 WinDbg 檢視例外狀況記錄、呼叫堆疊和 LastEvent

使用 .jdinfo 命令將內容設定為失敗時刻之後,您可以檢視 .jdinfo、呼叫堆棧和 lastevent 所傳回的例外狀況記錄,如下所示,以調查原因。

0:000> .jdinfo  0x00000000003E0000
----- Exception occurred on thread 0:15c8
ntdll!NtWaitForMultipleObjects+0x14:
00007ffc`81a959a4 c3              ret

----- Exception record at 00000000`003e0028:
ExceptionAddress: 00007ff791d81014 (CrashAV_x64!wmain+0x0000000000000014)
   ExceptionCode: c0000005 (Access violation)
  ExceptionFlags: 00000000
NumberParameters: 2
   Parameter[0]: 0000000000000001
   Parameter[1]: 0000000000000000
Attempt to write to address 0000000000000000
...

0:000> k
  *** Stack trace for last set context - .thread/.cxr resets it
# Child-SP          RetAddr           Call Site
00 00000000`006ff8b0 00007ff7`91d811d2 CrashAV_x64!wmain+0x14 [c:\my\my_projects\crash\crashav\crashav.cpp @ 14]
01 00000000`006ff8e0 00007ffc`7fa38364 CrashAV_x64!__tmainCRTStartup+0x11a [f:\dd\vctools\crt_bld\self_64_amd64\crt\src\crtexe.c @ 579]
02 00000000`006ff910 00007ffc`81a55e91 KERNEL32!BaseThreadInitThunk+0x14
03 00000000`006ff940 00000000`00000000 ntdll!RtlUserThreadStart+0x21

0:000> .lastevent
Last event: 153c.5d0: Break instruction exception - code 80000003 (first chance)
  debugger time: Thu Sep  8 12:55:08.968 2016 (UTC - 7:00)