Ejemplos de depuración de AML
Estos son ejemplos que muestran cómo empezar a trabajar con la depuración de AML.
Investigación de un equipo congelado
Si el equipo de destino se ha congelado y sospecha que puede ser un problema ACPI, empiece por usar la extensión !amli lc para mostrar todos los contextos activos:
kd> !amli lc
*Ctxt=ffffffff8128d000, ThID=ffffffff81277880, Flgs=----R----, pbOp=ffffffff8124206c, Obj=\_SB.PCI0.ISA0.FDC0._CRS
Si no se muestran contextos, es probable que el error no esté relacionado con ACPI.
Si se muestran contextos, busque el marcado con un asterisco. Este es el contexto actual (el que ejecuta el intérprete en este momento).
En este ejemplo, el equipo de destino ejecuta Windows en un procesador de 32 bits. Por lo tanto, todas las direcciones se convierten a 64 bits, lo que produce un FFFFFFFF gratuito en los 32 bits altos. La abreviatura pbOp indica el puntero de instrucción ("puntero a códigos de operación binarios"). El campo Obj proporciona la ruta de acceso completa y el nombre del método tal como aparece en las tablas ACPI. Para obtener una descripción de las marcas, vea !amli lc.
Puede usar el comando !amli u para desensamblar el método _CRS de la siguiente manera:
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)
Dividir en el depurador de AMLI
El comando !amli debugger hace que el intérprete de AML se interrumpa en el depurador de AMLI la próxima vez que se ejecute cualquier código de AML.
Una vez que aparezca el símbolo del sistema del depurador de AMLI, puede usar cualquiera de los comandos del depurador de AMLI. También puede usar los comandos de extensión !amli sin prefijarlos 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 de puntos de interrupción
En el ejemplo siguiente, se dividirá en el depurador de AMLI antes de que se ejecute el método _BST.
Incluso si ha localizado un objeto _BST, debe comprobar que es realmente un método. Puede usar la extensión dns !amli para hacerlo.
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)
Ahora puede usar el comando !amli bp para colocar el punto de interrupción:
kd> !amli bp \_sb.pci0.isa.bat1._bst
También puede colocar puntos de interrupción dentro del método . Puede usar el comando !amli u para desensamblar _BST y, a continuación, colocar un punto de interrupción en uno de sus pasos:
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
Responder a un punto de interrupción desencadenado
En el ejemplo siguiente, el método _WAK se está ejecutando y, a continuación, encuentra un punto de interrupción:
Running \_WAK method
Hit Breakpoint 0.
Use la extensión !amli ln para ver el método más cercano al contador del programa actual. En el ejemplo siguiente se muestran direcciones en forma de 32 bits:
kd> !amli ln
c29accf5: \_WAK
La extensión !amli lc muestra todos los contextos activos:
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
Esto muestra que los contextos activos están asociados a los métodos _Q09 y _WAK. El contexto actual es _WAK.
Ahora puede usar el comando !amli r para mostrar más detalles sobre el contexto actual. A partir de esto, puede ver información útil sobre subprocesos y pilas, así como argumentos pasados a _WAK y los objetos de datos locales.
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()
Seguimiento, ejecución paso a paso y ejecución de código AML
Si desea realizar un seguimiento mediante el código, puede activar la información de seguimiento completa mediante la extensión de conjunto !amli como se indica a continuación:
kd> !amli set spewon verboseon traceon
Ahora puede recorrer paso a paso el código AML, viendo que el código se ejecuta línea a línea. El comando p realiza los pasos de las llamadas de función. El comando t depurará paso a paso por instrucciones de las llamadas de función.
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"
También puede ejecutar métodos desde el depurador de AMLI si lo desea. Por ejemplo, puede evaluar el estado del dispositivo LNKA ejecutando su método de control _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])