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 位中生成无端的 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 debugger命令会使 AML 解释器在下次执行任何 AML 代码时闯入 AMLI 调试器。

出现 AMLI 调试器提示后,可以使用任何 AMLI 调试器命令。 还可以使用 !amli 扩展命令,而无需为它们添加前缀“!aml”:

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 调试器中运行方法。 例如,可以通过运行其控制方法 _STA 来评估 LNKA 设备的状态:

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 调试器