虚拟机里装的是xp-sp3,在安全模式下用checked acpi.sys替换了/driver里的acpi.sys.
下载了checked 的acpi.pdb.sys,重命名后替换了自动从微软符号服务器下载的acpi.pdb.
!amli debugger时候没有任何提示,但是用!amli dns测试的时候提示:
AMLI_DBGERR: failed to get root object address
不知道是什么原因,各位有经验的,可以指教下!
从!amli debugger的结果来看,应该是成功与AMLI调试引擎握手了。
手动下载和替换ACPI.pdb是没有必要的,而且可能是导致问题的原因。WinDBG会根据GUID+Age产生路径的打开里面的PDB。
建议删除手工复制的PDB和所在目录,然后设置符号服务器,执行.reload重新下载正确的符号,然后再看是否还有问题。 如果还有问题,那么把当时的命令记录多复制一些过来...
按照您的提示,删除了主机acpi.pdb所在的目录,重新主机,目标机连接,
中断到调试器windbg, lm,发现acpi模块的符号deffered,
再!amli debugger,没有任何提示,lm命令,发现ACPI模块后面的符号路径已经出现了,
!amli dns,依旧AMLI_DBGERR: failed to get root object address, (只有一行错误提示,没有更多的提示可以提供了)
kd> !amli setAMLTrace =offAMLDebugSpew =offLoadDDBBreak =offErrorBreak =offVerboseMode =offLogEvent =offLogSize =0kd> !amli set spewon
kd> !amli setAMLTrace =offAMLDebugSpew =onLoadDDBBreak =offErrorBreak =offVerboseMode =offLogEvent =offLogSize =0
不管它了,g 发现并没有因为ACPI事件而中断到调试器了,目标机直接进入了操作系统。
进入了虚拟机操作系统后,发现:设备管理器->计算机,下面出现:
ACPI Uniprocessor PC
Standard PC 依据我的理解,
上述两项说的是APCI和APM的电源管理方式,是否是这个原因,就是说虚拟机对ACPI协议的支持并不是很好导致了上述的问题,
本来虚拟机不能待机这个就是事实啊!
虚拟机下也是可以调试的。下面的输出就都是调试VPC的目标得到的。
ACPI命名空间的根节点保存在全局变量ACPI!gpnsNameSpaceRoot中。上面的错误信息应该就是说找到不到这个变量的地址。
建议你这样操作一下:
kd> x ACPI!gpnsNameSpaceRootf9a0263c ACPI!gpnsNameSpaceRoot = <no type information>
kd> dd ACPI!gpnsNameSpaceRoot l1f9a0263c 817a0024上面的结果就是ACPI树的根节点817a0024
kd> !amli dns
AMLI(? for help)-> dnsdns
ACPI Name Space: \ (817a0024)
...
有了这个地址后,可以把这个地址直接传给dns命令:
kd> !amli dns /s 817a0024
ACPI Name Space: \ (817a0024)Unknown(\___)| Unknown(_GPE)| Unknown(_PR_)| Unknown(_SB_)| | Package(PR00:NumElements=33){| | | Package(:NumElements=4){
得到的结果也是一样的。
kd> x ACPI!gpnsNameSpaceRoot
fab1143c ACPI!gpnsNameSpaceRoot =
kd> dd ACPI!gpnsNameSpaceRoot
fab1143c 00000000 00000000 00000000 00000000
fab1144c 00000000 00000000 00000000 00000000
fab1145c 00000000 00000000 00000000 00000000
fab1146c 00000000 00000000 00000000 00000000
fab1147c 00000000 00000000 00000000 00000000
fab1148c 00000000 00000000 00000000 00000000
fab1149c 00000000 00000000 00000000 00000000
fab114ac 00000000 00000000 00000000 00000000
kd> dd ACPI!gpnsNameSpaceRoot l1 fab1143c 00000000
ACPI树的根节点找不到,还有我使用的是VMware的虚拟机,
而不是VPC,不知道对调试有没有影响。
您说的“在保护模式下替换checked acpi.sys”,我按照网络上的理解,
在安全模式下替换的,理解是否准确呢?
赫赫,同意第一点的结论,看来就是观察的时机太早了,在内核初始断点命中时就观察,ACPI树还没建立好呢,所以gpnsNameSpaceRoot 指针的内容是0。这里体现出了网络沟通的局限,我的确没有预料到是在初始断点命中时就执行dns命令:-)
第二点不正确,check版本的acpi驱动可以和free版本的内核文件一起工作,因此没有必要更换内核文件。