Przykłady debugowania AML

Poniżej przedstawiono przykłady ilustrujące sposób rozpoczynania pracy z debugowaniem AML.

Badanie zamrożonego komputera

Jeśli komputer docelowy został zamrożony i podejrzewasz, że może to być problem ACPI, zacznij od użycia rozszerzenia !amli lc , aby wyświetlić wszystkie aktywne konteksty:

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

Jeśli nie są wyświetlane żadne konteksty, błąd prawdopodobnie nie jest związany z ACPI.

Jeśli są wyświetlane konteksty, poszukaj tego oznaczonego gwiazdką. Jest to bieżący kontekst (ten, który jest wykonywany przez interpreter w tej chwili).

W tym przykładzie komputer docelowy działa z systemem Windows na 32-bitowym procesorze. W związku z tym wszystkie adresy są rzutowane na 64 bity, co skutkuje dodaniem niepotrzebnego FFFFFFFF w wyższych 32 bitach. Skrót pbOp oznacza wskaźnik rozkazów ("wskaźnik do binarnych kodów op"). Pole Obj zawiera pełną ścieżkę i nazwę metody, która pojawia się w tabelach ACPI. Aby uzyskać opis flag, zobacz !amli lc.

Możesz użyć polecenia !amli u , aby zdezasemblować metodę _CRS w następujący sposób:

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)

Przenikanie do debuggera AMLI

Polecenie !amli debugger powoduje, że interpreter AML włamuje się do debugera AMLI przy następnym wykonaniu kodu AML.

Po wyświetleniu monitu debugera AMLI można użyć dowolnego z poleceń debugera AMLI. Można również użyć poleceń rozszerzeń !amli bez dodawania przedrostka "!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)

Używanie punktów przerwania

W poniższym przykładzie nastąpi włamanie do debugera AMLI przed wykonaniem metody _BST.

Nawet jeśli znajduje się obiekt _BST, należy sprawdzić, czy jest to rzeczywiście metoda. Aby to zrobić, możesz użyć rozszerzenia dns !amli .

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)

Teraz możesz użyć polecenia !amli bp, aby umieścić punkt przerwania:

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

Możesz również umieścić punkty przerwania w metodzie . Możesz użyć polecenia !amli u, aby zdemontować _BST, a następnie umieścić punkt przerwania na jednym z jego kroków.

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

Reakcja na wyzwolony punkt przerwania

W poniższym przykładzie metoda _WAK jest uruchomiona, a następnie napotka punkt przerwania:

Running \_WAK method
Hit Breakpoint 0.

Użyj rozszerzenia !amli ln , aby wyświetlić najbliższą metodę bieżącego licznika programu. Poniższy przykład przedstawia adresy w postaci 32-bitowej:

kd> !amli ln
c29accf5: \_WAK

Rozszerzenie !amli lc wyświetla wszystkie aktywne konteksty:

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

Pokazuje to, że aktywne konteksty są skojarzone z metodami _Q09 i _WAK. Bieżący kontekst jest _WAK.

Teraz możesz użyć polecenia !amli r , aby wyświetlić więcej szczegółów na temat bieżącego kontekstu. Dzięki temu można zobaczyć przydatne informacje o wątku i stosie, a także argumenty przekazywane do _WAK i obiektów danych lokalnych.

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

Śledzenie, krokowanie i uruchamianie kodu AML

Jeśli chcesz śledzić kod, możesz włączyć pełne informacje śledzenia przy użyciu rozszerzenia !amli set w następujący sposób:

kd> !amli set spewon verboseon traceon

Teraz możesz przejść przez kod AML, obserwując, jak kod wykonuje wiersz według wiersza. Polecenie p omija wszystkie wywołania funkcji. Polecenie t przejdzie do wywołań funkcji.

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"

Jeśli wybierzesz, możesz również uruchamiać metody z poziomu debugera AMLI. Możesz na przykład ocenić stan urządzenia LNKA, uruchamiając jego metodę sterowania _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])

Zobacz też

 Debugger AMLI