Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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