Esempi di debug AML
Ecco alcuni esempi che illustrano come iniziare a eseguire il debug AML.
Analisi di un computer congelato
Se il computer di destinazione ha bloccato e si sospetta che sia un problema ACPI, iniziare usando l'estensione !amli lc per visualizzare tutti i contesti attivi:
kd> !amli lc
*Ctxt=ffffffff8128d000, ThID=ffffffff81277880, Flgs=----R----, pbOp=ffffffff8124206c, Obj=\_SB.PCI0.ISA0.FDC0._CRS
Se non vengono visualizzati contesti, l'errore probabilmente non è correlato a ACPI.
Se sono visualizzati contesti, cercare quello contrassegnato con un asterisco. Questo è il contesto corrente (quello che viene eseguito dall'interprete al momento attuale).
In questo esempio il computer di destinazione esegue Windows in un processore a 32 bit. Pertanto tutti gli indirizzi vengono gettato su 64 bit, generando un FFFFFFFFFF gratuito nei 32 bit elevati. Il pbOp abbreviazione indica il puntatore all'istruzione ("puntatore ai codici op binari"). Il campo Obj fornisce il percorso completo e il nome del metodo come viene visualizzato nelle tabelle ACPI. Per una descrizione dei flag, vedere !amli lc.
È possibile usare il comando !amli u per smontare il metodo _CRS come segue:
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)
Interruzione nel debugger AMLI
Il comando del debugger !amli causa l'interruzione dell'interprete AML nel debugger AMLI alla successiva esecuzione di qualsiasi codice AML.
Dopo aver visualizzato il prompt del debugger AMLI, è possibile usare uno dei comandi del debugger AMLI. È anche possibile usare i comandi di estensione !amli senza prefissirli con "!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)
Uso dei punti di interruzione
Nell'esempio seguente si eseguirà l'interruzione nel debugger AMLI prima dell'esecuzione del metodo _BST.
Anche se si trova un oggetto _BST, è necessario verificare che sia effettivamente un metodo. È possibile usare l'estensione dns !amli per eseguire questa operazione.
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)
A questo punto è possibile usare il comando !amli bp per posizionare il punto di interruzione:
kd> !amli bp \_sb.pci0.isa.bat1._bst
È anche possibile inserire punti di interruzione all'interno del metodo. È possibile usare il comando !amli u per disassemblare _BST e quindi posizionare un punto di interruzione in uno dei passaggi seguenti:
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
Risposta a un punto di interruzione attivato
Nell'esempio seguente il metodo _WAK è in esecuzione e quindi rileva un punto di interruzione:
Running \_WAK method
Hit Breakpoint 0.
Usare l'estensione !amli ln per visualizzare il metodo più vicino al contatore del programma corrente. L'esempio seguente mostra gli indirizzi in formato a 32 bit:
kd> !amli ln
c29accf5: \_WAK
L'estensione !amli lc visualizza tutti i contesti attivi:
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
Ciò indica che i contesti attivi sono associati ai metodi _Q09 e _WAK. Il contesto corrente è _WAK.
È ora possibile usare il comando !amli r per visualizzare altri dettagli sul contesto corrente. In questo modo è possibile visualizzare informazioni utili su thread e stack, nonché argomenti passati a _WAK e agli oggetti dati locali.
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()
Traccia, esecuzione e esecuzione di codice AML
Se si vuole tracciare il codice, è possibile attivare le informazioni di traccia completa usando l'estensione !amli set come indicato di seguito:
kd> !amli set spewon verboseon traceon
A questo punto è possibile eseguire il codice AML, osservando la riga di esecuzione del codice in base alla riga. Il comando p esegue la procedura per tutte le chiamate di funzione. Il comando t eseguirà le chiamate di funzione.
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"
È anche possibile eseguire metodi dall'interno del debugger AMLI se si sceglie. Ad esempio, è possibile valutare lo stato del dispositivo LNKA eseguendo il metodo di controllo _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])