Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Ecco alcuni esempi che illustrano come iniziare a eseguire il debug AML.
Analisi di un computer bloccato
Se il computer di destinazione è 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, è probabile che l'errore non sia correlato a ACPI.
Se sono presenti contesti visualizzati, cercare quello contrassegnato con un asterisco. Si tratta del contesto corrente (quello che viene eseguito dall'interprete in questo momento).
In questo esempio, il computer di destinazione esegue Windows in un processore a 32 bit. Di conseguenza, tutti gli indirizzi vengono convertiti a 64 bit, producendo un FFFFFFFF involontario nei 32 bit alti. L'abbreviazione pbOp indica il puntatore dell'istruzione ("puntatore ai codici operativi binari"). Il campo Obj fornisce il percorso completo e il nome del metodo così come viene visualizzato nelle tabelle ACPI. Per una descrizione dei flag, vedere !amli lc.
È possibile usare il comando !amli u per disassemblare il metodo _CRS come indicato di seguito:
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)
Accedere al debugger AMLI
Il comando !amli debugger fa sì che l'interprete AML entri nel debugger AMLI alla prossima esecuzione di qualsiasi codice AML.
Quando viene visualizzato il prompt del debugger AMLI, è possibile usare uno qualsiasi dei comandi del debugger AMLI. È anche possibile usare i comandi di estensione !amli senza anteporrli a "!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 interromperà il debugger AMLI prima dell'esecuzione del metodo _BST.
Anche se si trova un oggetto _BST, è necessario verificare che sia effettivamente un metodo. A tale scopo, è possibile usare l'estensione 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)
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ò mostra 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 sul thread e sullo stack, nonché parametri 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()
Tracciamento, passaggio ed esecuzione del 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
Ora puoi eseguire il codice AML passo-passo, osservando l'esecuzione del codice riga per riga. Il comando p ignora tutte le chiamate di funzione. Il comando t entrerà nelle 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"
Se si sceglie, è anche possibile eseguire metodi dal debugger AMLI. Ad esempio, è possibile valutare lo stato del dispositivo LNKA eseguendo il relativo 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])