Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berikut adalah contoh yang menggambarkan cara memulai debugging AML.
Menyelidiki Komputer yang Hang
Jika komputer target telah membeku dan Anda menduga itu mungkin masalah ACPI, mulailah dengan menggunakan ekstensi !amli lc untuk menampilkan semua konteks aktif:
kd> !amli lc
*Ctxt=ffffffff8128d000, ThID=ffffffff81277880, Flgs=----R----, pbOp=ffffffff8124206c, Obj=\_SB.PCI0.ISA0.FDC0._CRS
Jika tidak ada konteks yang ditampilkan, kesalahan mungkin tidak terkait ACPI.
Jika ada konteks yang ditampilkan, cari konteks yang ditandai dengan tanda bintang. Ini adalah konteks saat ini (yang sedang dijalankan oleh penerjemah saat ini).
Dalam contoh ini, komputer target menjalankan Windows pada prosesor 32-bit. Oleh karena itu semua alamat dikonversi menjadi 64 bit, menghasilkan FFFFFFFF yang tidak diperlukan di 32 bit bagian atas. Singkatan pbOp menunjukkan penunjuk instruksi ("penunjuk ke kode operasi biner"). Bidang Obj memberikan jalur lengkap dan nama metode seperti yang muncul dalam tabel ACPI. Untuk deskripsi bendera, lihat !amli lc.
Anda dapat menggunakan perintah !amli u untuk membongkar metode _CRS sebagai berikut:
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)
Memasuki Debugger AMLI
Perintah debugger !amli menyebabkan penerjemah AML masuk ke AMLI Debugger lain kali kode AML dijalankan.
Setelah perintah AMLI Debugger muncul, Anda dapat menggunakan salah satu perintah AMLI Debugger. Anda juga dapat menggunakan perintah ekstensi !amli tanpa mengawalinya dengan "!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)
Menggunakan Titik Henti
Dalam contoh berikut, Anda akan masuk ke AMLI Debugger sebelum metode _BST dijalankan.
Bahkan jika Anda telah menemukan objek _BST, Anda harus memverifikasi bahwa itu memang metode. Anda dapat menggunakan ekstensi dns !amli untuk melakukan ini.
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)
Sekarang Anda dapat menggunakan perintah !amli bp untuk menempatkan titik henti:
kd> !amli bp \_sb.pci0.isa.bat1._bst
Anda mungkin juga ingin menempatkan titik henti di dalam metode. Anda dapat menggunakan perintah !amli u untuk membongkar _BST dan kemudian menempatkan titik henti pada salah satu langkahnya:
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
Merespons Titik Henti yang Dipicu
Dalam contoh berikut, metode yang _WAK jalankan lalu mengalami titik henti:
Running \_WAK method
Hit Breakpoint 0.
Gunakan ekstensi !amli ln untuk melihat metode terdekat ke penghitung program saat ini. Contoh berikut menunjukkan alamat dalam bentuk 32-bit:
kd> !amli ln
c29accf5: \_WAK
Ekstensi lc !amli menampilkan semua konteks aktif:
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
Ini menunjukkan bahwa konteks aktif dikaitkan dengan metode _Q09 dan _WAK. Konteks saat ini _WAK.
Sekarang Anda dapat menggunakan perintah !amli r untuk menampilkan detail selengkapnya tentang konteks saat ini. Dari sini Anda dapat melihat informasi utas dan tumpukan yang berguna, serta argumen yang diteruskan ke _WAK dan objek data lokal.
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()
Melacak, Menelusuri Langkah, dan Menjalankan Kode AML
Jika Anda ingin melacak melalui kode, Anda dapat mengaktifkan informasi pelacakan penuh dengan menggunakan ekstensi set !amli sebagai berikut:
kd> !amli set spewon verboseon traceon
Sekarang Anda dapat menelusuri kode AML, melihat kode dijalankan baris demi baris. Perintah p melewati panggilan fungsi apa pun. Perintah t akan melangkah ke panggilan fungsi.
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"
Anda juga dapat menjalankan metode dari dalam AMLI Debugger jika Anda memilih. Misalnya, Anda dapat mengevaluasi status perangkat LNKA dengan menjalankan metode kontrolnya _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])