Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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])