Freigeben über


AML-Debugbeispiele

Hier finden Sie Beispiele, die die ersten Schritte mit dem AML-Debuggen veranschaulichen.

Untersuchen eines fixierten Computers

Wenn der Zielcomputer eingefroren ist und Sie vermuten, dass es sich um ein ACPI-Problem handelt, verwenden Sie zunächst die Erweiterung !amli lc , um alle aktiven Kontexte anzuzeigen:

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

Wenn keine Kontexte angezeigt werden, ist der Fehler wahrscheinlich nicht ACPI-bezogen.

Wenn Kontexte angezeigt werden, suchen Sie nach dem, der mit einem Sternchen gekennzeichnet ist. Dies ist der aktuelle Kontext (der, der derzeit vom Interpreter ausgeführt wird).

In diesem Beispiel wird windows auf dem Zielcomputer auf einem 32-Bit-Prozessor ausgeführt. Daher werden alle Adressen in 64 Bits umgewandelt, was zu einem unnötigen FFFFFF in den hohen 32 Bits führt. Die Abkürzung pbOp gibt den Anweisungszeiger ("Zeiger auf binäre Op-Codes") an. Das Obj-Feld gibt den vollständigen Pfad und Namen der Methode an, wie er in den ACPI-Tabellen angezeigt wird. Eine Beschreibung der Flags finden Sie unter !amli lc.

Sie können den Befehl !amli u verwenden, um die _CRS-Methode wie folgt zu disassemblieren:

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)

Einbruch in den AMLI-Debugger

Der Befehl !amli-Debugger bewirkt, dass der AML-Interpreter beim nächsten Ausführen von AML-Code in den AMLI-Debugger einbricht.

Nachdem die AMLI-Debuggereingabeaufforderung angezeigt wird, können Sie jeden der AMLI-Debuggerbefehle verwenden. Sie können auch !amli-Erweiterungsbefehle verwenden, ohne ihnen das Präfix "!amli" zu geben:

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)

Verwenden von Haltepunkten

Im folgenden Beispiel brechen Sie in den AMLI-Debugger ein, bevor die Methode _BST ausgeführt wird.

Auch wenn Sie ein _BST-Objekt gefunden haben, sollten Sie überprüfen, ob es sich tatsächlich um eine Methode handelt. Dazu können Sie die DNS-Erweiterung !amli verwenden.

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)

Jetzt können Sie den Befehl !amli bp verwenden, um den Haltepunkt zu platzieren:

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

Möglicherweise möchten Sie auch Haltepunkte innerhalb der -Methode platzieren. Sie können den Befehl !amli u verwenden, um _BST zu disassemblieren und dann einen Haltepunkt auf einem seiner Schritte zu platzieren:

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

Reagieren auf einen ausgelösten Haltepunkt

Im folgenden Beispiel wird die Methode _WAK ausgeführt und trifft dann auf einen Haltepunkt:

Running \_WAK method
Hit Breakpoint 0.

Verwenden Sie die Erweiterung !amli ln , um die nächste Methode zum aktuellen Programmzähler anzuzeigen. Das folgende Beispiel zeigt Adressen im 32-Bit-Format:

kd> !amli ln
c29accf5: \_WAK

Die Erweiterung !amli lc zeigt alle aktiven Kontexte an:

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

Dies zeigt, dass die aktiven Kontexte den Methoden _Q09 und _WAK zugeordnet sind. Der aktuelle Kontext ist _WAK.

Jetzt können Sie den Befehl !amli r verwenden, um weitere Details zum aktuellen Kontext anzuzeigen. Hier sehen Sie nützliche Thread- und Stapelinformationen sowie Argumente, die an _WAK und die lokalen Datenobjekte übergeben werden.

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

Ablaufverfolgung, Schrittschritt und Ausführen von AML-Code

Wenn Sie den Code nachverfolgen möchten, können Sie vollständige Ablaufverfolgungsinformationen aktivieren, indem Sie die !amli set-Erweiterung wie folgt verwenden:

kd> !amli set spewon verboseon traceon

Jetzt können Sie den AML-Code schrittweise durchlaufen und dabei beobachten, wie der Code Zeile für Zeile ausgeführt wird. Der p-Befehl führt schritte über alle Funktionsaufrufe aus. Mit dem t-Befehl werden Funktionsaufrufe schrittweise ausgeführt.

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"

Sie können methoden auch im AMLI-Debugger ausführen, wenn Sie möchten. Sie können beispielsweise die status des LNKA-Geräts auswerten, indem Sie dessen Steuerungsmethode _STA ausführen:

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

Weitere Informationen

 Der AMLI-Debugger