Partager via


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])

Voir aussi

 Débogueur AMLI