Exemples de débogage AML
Voici des exemples qui illustrent comment bien démarrer avec le débogage AML.
Examen d’un ordinateur figé
Si l’ordinateur cible est bloqué et que vous pensez qu’il peut s’agir d’un problème ACPI, commencez par utiliser l’extension !amli lc pour afficher tous les contextes actifs :
kd> !amli lc
*Ctxt=ffffffff8128d000, ThID=ffffffff81277880, Flgs=----R----, pbOp=ffffffff8124206c, Obj=\_SB.PCI0.ISA0.FDC0._CRS
Si aucun contexte n’est affiché, l’erreur n’est probablement pas liée à ACPI.
Si des contextes sont affichés, recherchez celui marqué avec un astérisque. Il s’agit du contexte actuel (celui qui est exécuté par l’interpréteur au moment actuel).
Dans cet exemple, l’ordinateur cible exécute Windows sur un processeur 32 bits. Par conséquent, toutes les adresses sont converties en 64 bits, ce qui produit un FFFFFFFF gratuit dans les 32 bits élevés. L’abréviation pbOp indique le pointeur d’instruction (« pointeur vers les codes d’opération binaires »). Le champ Obj donne le chemin d’accès complet et le nom de la méthode tel qu’il apparaît dans les tables ACPI. Pour obtenir une description des indicateurs, consultez !amli lc.
Vous pouvez utiliser la commande !amli u pour désassembler la méthode _CRS comme suit :
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)
Cassage dans le débogueur AMLI
La commande !amli débogueur entraîne l’arrêt de l’interpréteur AML dans le débogueur AMLI la prochaine fois qu’un code AML est exécuté.
Une fois l’invite de débogueur AMLI affichée, vous pouvez utiliser l’une des commandes du débogueur AMLI. Vous pouvez également utiliser les commandes d’extension !amli sans les préfixer de « !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)
Utilisation de points d’arrêt
Dans l’exemple suivant, vous allez insérer le débogueur AMLI avant l’exécution de la méthode _BST.
Même si vous avez localisé un objet _BST, vous devez vérifier qu’il s’agit bien d’une méthode. Pour ce faire, vous pouvez utiliser l’extension 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)
Vous pouvez maintenant utiliser la commande !amli bp pour placer le point d’arrêt :
kd> !amli bp \_sb.pci0.isa.bat1._bst
Vous pouvez également placer des points d’arrêt dans la méthode . Vous pouvez utiliser la commande !amli u pour désassembler _BST, puis placer un point d’arrêt sur l’une de ses étapes :
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
Réponse à un point d’arrêt déclenché
Dans l’exemple suivant, la méthode _WAK est en cours d’exécution, puis rencontre un point d’arrêt :
Running \_WAK method
Hit Breakpoint 0.
Utilisez l’extension !amli ln pour afficher la méthode la plus proche du compteur de programme actuel. L’exemple suivant montre les adresses sous forme 32 bits :
kd> !amli ln
c29accf5: \_WAK
L’extension !amli lc affiche tous les contextes actifs :
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
Cela montre que les contextes actifs sont associés aux méthodes _Q09 et _WAK. Le contexte actuel est _WAK.
Vous pouvez maintenant utiliser la commande !amli r pour afficher plus de détails sur le contexte actuel. À partir de là, vous pouvez voir des informations de thread et de pile utiles, ainsi que des arguments passés à _WAK et aux objets de données locaux.
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()
Suivi, pas à pas et exécution de code AML
Si vous souhaitez suivre le code, vous pouvez activer les informations de suivi complètes à l’aide de l’extension !amli set comme suit :
kd> !amli set spewon verboseon traceon
Vous pouvez maintenant parcourir le code AML, en regardant le code s’exécuter ligne par ligne. La commande p effectue des étapes sur n’importe quel appel de fonction. La commande t effectue un pas à pas détaillé dans les appels de fonction.
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"
Vous pouvez également exécuter des méthodes à partir du débogueur AMLI si vous le souhaitez. Par exemple, vous pouvez évaluer la status de l’appareil LNKA en exécutant sa méthode de contrôle _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])