AML 偵錯範例

以下是說明如何開始使用 AML 偵錯的範例。

調查凍結的電腦

如果目的電腦已凍結,而且您懷疑它可能是 ACPI 問題,請從使用 !amli lc 擴充功能開始顯示所有作用中內容:

kd> !amli lc
*Ctxt=ffffffff8128d000, ThID=ffffffff81277880, Flgs=----R----, pbOp=ffffffff8124206c, Obj=\_SB.PCI0.ISA0.FDC0._CRS

如果未顯示任何內容,則錯誤可能與 ACPI 無關。

如果有顯示的內容,請尋找以星號標示的內容。 這是目前 (解譯器目前) 所執行 的內容

在此範例中,目的電腦是在 32 位處理器上執行 Windows。 因此,所有位址都會轉換成 64 位,以高 32 位產生 gratu要 FFFFFFFF。 縮寫 pbOp 表示指令指標 (「二進位作業代碼指標」) 。 Obj欄位會提供方法的完整路徑和名稱,因為它出現在 ACPI 資料表中。 如需旗標的描述,請參閱 !amli lc

您可以使用 !amli u 命令來反組譯_CRS方法,如下所示:

kd> !amli u \_SB.PCI0.ISA0.FDC0._CRS

ffffffff80e4a535 : CreateDWordFieldCRES, 0x76, RAMT)
ffffffff80e4a540 : CreateDWordField(CRES, 0x82, PCIT)
ffffffff80e4a54b : Add(MLEN(), 0x100000, RAMT)
ffffffff80e4a559 : Subtract(0xffe00000, RAMT, PCIT)
ffffffff80e4a567 : Return(CRES)

中斷 AMLI 偵錯工具

!amli 偵錯工具命令會導致 AML 解譯器在下一次執行任何 AML 程式碼時中斷 AMLI 偵錯工具。

出現 AMLI 偵錯工具提示之後,您可以使用任何 AMLI 偵錯工具命令。 您也可以使用 !amli 擴充命令,而不使用 「!amli」 前置詞:

kd> !amli debugger
kd> g

AMLI(? for help)-> find _crs
\_SB.LNKA._CRS
\_SB.LNKB._CRS
\_SB.LNKC._CRS
\_SB.LNKD._CRS
\_SB.PCI0._CRS
\_SB.PCI0.LPC.NCP._CRS
\_SB.PCI0.LPC.PIC._CRS
\_SB.PCI0.LPC.TIME._CRS
\_SB.PCI0.LPC.IDMA._CRS
\_SB.PCI0.LPC.RTC._CRS
\_SB.PCI0.LPC.SPKR._CRS
\_SB.PCI0.LPC.FHUB._CRS
\_SB.PCI0.SBD1._CRS
\_SB.PCI0.SBD2._CRS
\_SB.MBRD._CRS

AMLI(? for help)-> u \_SB.PCI0._CRS

ffffffff80e4a535 : CreateDWordFieldCRES, 0x76, RAMT)
ffffffff80e4a540 : CreateDWordField(CRES, 0x82, PCIT)
ffffffff80e4a54b : Add(MLEN(), 0x100000, RAMT)
ffffffff80e4a559 : Subtract(0xffe00000, RAMT, PCIT)
ffffffff80e4a567 : Return(CRES)

使用中斷點

在下列範例中,您會在執行方法_BST之前,先進入 AMLI 偵錯工具。

即使您已找到_BST物件,您也應該確認它確實是方法。 您可以使用 !amli dns 延伸模組來執行此動作。

kd> !amli dns /s \_sb.pci0.isa.bat1._bst

ACPI Name Space: \_SB.PCI0.ISA.BAT1._BST (c29c2044)
Method(_BST:Flags=0x0,CodeBuff=c29c20a5,Len=103)

現在您可以使用 !amli bp 命令來放置中斷點:

kd> !amli bp \_sb.pci0.isa.bat1._bst

您也可以在 方法中放置中斷點。 您可以使用 !amli u 命令來反組譯_BST,然後在其中一個步驟上放置中斷點:

kd> !amli u _sb.pci0.isa.bat1._bst

ffffffffc29c20a5: Acquire(\_SB_.PCI0.ISA_.EC0_.MUT1, 0xffff)
ffffffffc29c20c0: Store("CMBatt - _BST.BAT1", Debug)
ffffffffc29c20d7: \_SB_.PCI0.ISA_.EC0_.CPOL()
ffffffffc29c20ee: Release(\_SB_.PCI0.ISA_.EC0_.MUT1)
ffffffffc29c2107: Return(PBST)

kd> !amli bp c29c20ee

回應觸發的中斷點

在下列範例中,方法_WAK正在執行,然後遇到中斷點:

Running \_WAK method
Hit Breakpoint 0.

使用 !amli ln 延伸模組來查看目前程式計數器的最接近方法。 下列範例顯示 32 位格式的位址:

kd> !amli ln
c29accf5: \_WAK

!amli lc延伸模組會顯示所有使用中內容:

kd> !amli lc
 Ctxt=c18b6000, ThID=00000000, Flgs=A-QC-W----, pbOp=c29bf8fe, Obj=\_SB.PCI0.ISA.EC0._Q09
*Ctxt=c18b4000, ThID=c15a6618, Flgs=----R-----, pbOp=c29accf5, Obj=\_WAK

這會顯示使用中內容與方法_Q09和_WAK相關聯。 目前的內容_WAK。

現在您可以使用 !amli r 命令來顯示目前內容的詳細資料。 您可以從中查看有用的執行緒和堆疊資訊,以及傳遞至_WAK和本機資料物件的引數。

kd> !amli r
Context=c18b4000*, Queue=00000000, ResList=00000000
ThreadID=c15a6618, Flags=00000010
StackTop=c18b5eec, UsedStackSize=276 bytes, FreeStackSize=7636 bytes
LocalHeap=c18b40c0, CurrentHeap=c18b40c0, UsedHeapSize=88 bytes
Object=\_WAK, Scope=\_WAK, ObjectOwner=c18b4108, SyncLevel=0
AsyncCallBack=ff06b5d0, CallBackData=0, CallBackContext=c99efddc

MethodObject=\_WAK
c18b40e4: Arg0=Integer(:Value=0x00000001[1])
c18b5f3c: Local0=Unknown()
c18b5f54: Local1=Unknown()
c18b5f6c: Local2=Unknown()
c18b5f84: Local3=Unknown()
c18b5f9c: Local4=Unknown()
c18b5fb4: Local5=Unknown()
c18b5fcc: Local6=Unknown()
c18b5fe4: Local7=Unknown()
c18b4040: RetObj=Unknown()

追蹤、逐步執行和執行 AML 程式碼

如果您想要透過程式碼進行追蹤,您可以使用 !amli set 擴充功能來開啟完整追蹤資訊,如下所示:

kd> !amli set spewon verboseon traceon

現在您可以逐步執行 AML 程式碼,並逐行監看程式碼執行程式碼。 p命令會逐步執行任何函式呼叫。 t命令會逐步執行函式呼叫。

AMLI(? for help)-> p

c29bfcb7: Store(\_SB_.PCI0.ISA_.ACAD.CHAC(SEL0=0x10e1)
c29c17b1: {
c29c17b1: | Store(LGreater(And(Arg0=0x10e1,0xf0,)=0xe0,0x80)=0xffffffff,Local0)=0xffffffff

AMLI(? for help)-> p

c29c17bb: | If(LNot(LEqual(Local0=0xffffffff,ACP_=0xffffffff)=0xffffffff)=0x0)
c29c17ce: | {
c29c17ce: | | Return(Zero)
c29c17d0: | }
c29c17d0: },Local1)=0x0

AMLI(? for help)-> t

c29bfcd4: Store(\_SB_.PCI0.ISA_.BAT1.CHBP(SEL0=0x10e1)
c29c293d: {
c29c293d: | Store("CMBatt - CHBP.BAT1",Debug)String(:Str="CMBatt - CHBP.BAT1")="CMBatt - CHBP.BAT1"

如果您選擇,您也可以從 AMLI 偵錯工具內執行方法。 例如,您可以執行 LNKA 裝置的控制方法來評估其狀態_STA:

AMLI(? for help)-> run \_sb.lnka._sta
PCI OpRegion Access on region c29b2268 device c29b2120

\_SB.LNKA._STA completed successfully with object data:
Integer(:Value=0x0000000b[11])

另請參閱

 AMLI 偵錯工具