Exempel på AML-felsökning

Här är exempel som illustrerar hur du kommer igång med AML-felsökning.

Undersöka en frusen dator

Om måldatorn har låsts och du misstänker att det kan vara ett ACPI-problem börjar du med att använda tillägget !amli lc för att visa alla aktiva kontexter:

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

Om inga kontexter visas är felet förmodligen inte ACPI-relaterat.

Om det finns kontexter som visas letar du efter den som har markerats med en asterisk. Det här är den aktuella kontexten (den som för närvarande körs av tolken).

I det här exemplet kör måldatorn Windows på en 32-bitars processor. Därför konverteras alla adresser till 64 bitar, vilket ger en överflödig FFFFFFFF i de höga 32 bitarna. Förkortningen pbOp anger instruktionspekaren ("pekare till binära op-koder"). Fältet Obj ger den fullständiga sökvägen och namnet på metoden så som den visas i ACPI-tabellerna. En beskrivning av flaggorna finns i !amli lc.

Du kan använda kommandot !amli u för att demontera metoden _CRS på följande sätt:

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)

Bryta sig in i AMLI-felsökningsprogrammet

Kommandot !amli debugger gör att AML-tolken bryter sig in i AMLI-felsökningsprogrammet nästa gång någon AML-kod körs.

När AMLI-felsökningsprompten visas kan du använda något av AMLI-felsökningskommandona. Du kan också använda ! amli-tilläggskommandon utan att prefixera dem med "!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)

Använda brytpunkter

I följande exempel bryter du dig in i AMLI-felsökningsprogrammet innan metoden _BST körs.

Även om du har hittat ett _BST objekt bör du kontrollera att det verkligen är en metod. Du kan använda dns-tillägget !amli för att göra detta.

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)

Nu kan du använda kommandot !amli bp för att placera brytpunkten:

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

Du kanske också vill placera brytpunkter i metoden. Du kan använda kommandot !amli u för att demontera _BST och sedan placera en brytpunkt i något av stegen:

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

Reagera på en utlösad brytpunkt

I följande exempel körs metoden _WAK och stöter sedan på en brytpunkt:

Running \_WAK method
Hit Breakpoint 0.

Använd !amli ln-tillägget för att se den närmaste metoden till den aktuella programräknaren. I följande exempel visas adresser i 32-bitarsformat:

kd> !amli ln
c29accf5: \_WAK

!amli lc-tillägget visar alla aktiva kontexter:

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

Detta visar att de aktiva kontexterna är associerade med metoderna _Q09 och _WAK. Den aktuella kontexten är _WAK.

Nu kan du använda kommandot !amli r för att visa mer information om den aktuella kontexten. Från detta kan du se användbar tråd- och stackinformation samt argument som skickas till _WAK och lokala dataobjekt.

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()

Spåra, stega och köra AML-kod

Om du vill spåra koden kan du aktivera fullständig spårningsinformation genom att använda förlängningskommandot !amli set på följande sätt:

kd> !amli set spewon verboseon traceon

Nu kan du gå igenom AML-koden och se koden köras rad för rad. P-kommandot hoppar över alla funktionsanrop. Kommandot t går in i funktionsanrop.

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"

Du kan också köra metoder inifrån AMLI-felsökningsprogrammet om du väljer det. Du kan till exempel utvärdera statusen för LNKA-enheten genom att köra dess kontrollmetod _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])

Se även

  AMLI-felsökningsprogrammet