最经遇到很多BSOD的问题,不免要学一下windebug的方法。

主要步骤如下:

在现代计算机中,硬件和固件(BIOS)都必须符合ACPI规范,以便操作系统可以控制所有模块的自动配置和电源管理。 使用WinDbg调试ACPI代码通常需要两台计算机,一台是目标机(Debuggee),另一台作为主机(Debugger)。下面就介绍一下怎么在两台机器上建立调试环境。

1、配置调试Debuggee的连接方式

Windbg支持COM、1394、USB2.0三种不同的连接方式,看到网上有些文章关于使用USB2.0来连接,需要购买特殊的USB调试线,而且价格不菲,本篇文章就不讨论了。笔记本电脑一般都没有COM端口,只好使用1394或是COM转USB,但在这里我只想讨论怎么使用COM端口来连接。

启动到操作系统,使用bootcfg命令或直接使用文本编辑器修改boot.ini文件,指定调试使用的端口及参数。为了使用COM端口来调试,需要在启动参数中加入/debug参数,并指定/debugport和/baudrate子参数来作为启动项。下面这个boot.ini文件的第一个启动项就是配置使用COM端口。/debugport子参数指出使用Debuggee的哪个COM口,/baudrate指出连接的速度(默认是每秒19200位)。

[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)/WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)/WINDOWS="Debugging with Cable" /fastdetect /debug /debugport=COM1 /baudrate=57600
multi(0)disk(0)rdisk(0)partition(1)/WINDOWS="Microsoft Windows XP Professional" /fastdetect

下面的例子使用bootcfg命令设置第一个启动项使用COM1端口、波特率为115200。bootcfg的/debug开关打开,/port开关及/baud参数指出端口和速度,/ID开关指出修改的是第一个启动项。

bootcfg /debug ON /port COM1 /baud 115200 /ID 1

2、建立AML调试环境

AML调试器被包含在checked版(调试版)的acpi.sys中,为了完全使用AML调试器,这个驱动必须要安装在目标机上。尽管Free版(正式版)的acpi.sys支持一部分的AMLI debugger扩展命令,但它并没有包含AMLI debugger。

如果你的目标机上已经安装Windows的checked版,运行的就是checked版的acpi.sys。如果安装的是free版的Windows,你可以选择重新安装一个完整的checked版或选择只安装checked版的acpi.sys。(肯定是后一种方式方便啊J),我会在另外一篇文章中讲讲怎么在free版的Windows中安装checked版的acpi.sys。

3、下载安装Windbg

Windbg在微软网站上有免费下载,http://www.microsoft.com/whdc/devtools/debugging/default.mspx,现在的版本是6.6.7.5。安装它没有什么特别之处,如果你曾经在别的机器上安装过,直接拷贝到你现在的机器上也能用。看到某些帖子说最好安装路径上不要有空格,可能会出问题,但我一直没碰到过。

4、主机端符号(Symbol)文件路径配置

首先,什么是symbol文件呢?Symbol文件包含了很多调试DLL、EXE文件的时候需要的数据,但它们在程序运行的时候没什么用。通俗的说,Symbol File是包含了相关二进制文件(EXE,DLL)调试信息的一种文件,它以.pdb为扩展名。比如Windows XP下有一个GDI32.dll,那么微软在编译该DLL的时候会产生一个GDI32.pdb文件,程序员有了这个PDB文件,愿意的话就可以用它来调试,跟踪到GDI32.dll的内部去!一般来说,symbol文件包含一下内容:

a.全局变量(Global variables)
    b.局部变量(Local variables)
    c.函数名和它们的入口地址(Function names and the addresses of their entry points)
    d.FPO data(frame pointer omission),frame pointer是一种用来在调用堆栈(Call stack)中找到下一个将要被调用的函数的数据结构源代码的行序号(Source-line numbers)

该文件和二进制文件的编译版本密切相关,比如你修改了DLL的输出函数等,再编译该DLL那么原先的PDB文件就过时了,不能再胜任调试的重担了,这时候你需要的是修改后编译产生的PDB文件。所以,主机端使用的Symbol文件一定要和目标机上安装的操作系统的版本要一致。

Symbol文件对于Windbg来说是至关重要的,如果找不到正确的Symbol文件,调试功能就没法使用。Windows的Symbol文件可以在微软网站上免费下载,http://www.microsoft.com/whdc/devtools/debugging/symbolpkg.mspx。可我不建议您这么做,因为不管是Checked版的还是Free版的Symbol都有近200M,下载过程相当痛苦。好在微软提供了Symbol服务器,使得Windbg可以自己在上面查找需要的模块。具体配置方法是:File-〉Symbol File Path…弹出符号文件对话框,输入:        SRV*C:/Symbols*http://msdl.microsoft.com/download/symbols,“C:/Symbols”可以是本地人一路径,用来保存下载的符号文件。

5、联机开始调试

A、启动目标机,当启动到启动菜单的时候,移动方向键,结束倒数计时,使它停在这个地方。

B、在主机上打开Windbg,File-〉kernel Debug,选择相应的连接方式,如果使用COM端口的话,在对话框中填写主机使用的COM端口以及所选择的波特率,波特率需要和目标机上的设置相同。

点击OK就大功告成了,尝试使用!amli debugger命令启动AMLI调试器,如果没什么动静,这就算成功了。开始调试你的ACPI代码吧

对于较小概率去追这个过程实在是在长了,想要抓到低概率事件确实不容易。丢一个开机过程得20-30分钟。

微软分析方法目前看到的是两种:

1.获取蓝屏时的设备

2.有时候指向多个设备,可以尝试指向具体的ASL code.基本的command是 !amli lc。查看上下文,找出Flash标志为R的,然后指向具体的设备。

:kd> !amli lc

Ctxt=ffffffffebc3a008,ThID=0000000000000000, Flgs=A--C-----, pbOp=ffffffff9020968e,Obj=\_SB.PCI0.LPEA._PS0

Ctxt=ffffffffca1dd800,ThID=0000000000000000, Flgs=A--C-----, pbOp=0000000000000000,Obj=\_SB.PCI0.PNIT._STA

Ctxt=ffffffff8ed771b8,ThID=0000000000000000, Flgs=A--C-----, pbOp=0000000000000000,Obj=\_SB.PCI0.SDHB._STA

Ctxt=ffffffff9c857008,ThID=0000000000000000, Flgs=A--C-----, pbOp=0000000000000000,Obj=\_SB.BTNS._STA

Ctxt=ffffffffbf630088,ThID=0000000000000000, Flgs=A--C-----, pbOp=0000000000000000,Obj=\_SB.PCI0.I2C6.TCSE._STA

Ctxt=ffffffffebdf6438,ThID=ffffffff8c607ac0, Flgs=---CR----, pbOp=ffffffff9024654a

如何使用windebug追踪ASL CODE相关推荐

  1. 通过Windbg来追踪ASL code的运行

    通过Windbg来追踪ASL code的运行: 目标机的配置: 第一步: 在BIOS Setup下面 disable secure boot(不然下面debug on 命令会失败):关闭防火墙. 第二 ...

  2. windbg调试ACPI ASL Code 实例一则

    准备工作:搭建ACPI调试环境请移步至:<搭建Win7调试ACPI的环境>里面有Checked Build ACPI.sys 本文中OS为Win7 x86(镜像:en_windows_7_ ...

  3. ASL code基本操作

    一.ASL基本准则 1.变量命名不超过四个字符,且不能以数字开头. 2.变量或者函数命名,不分大小写. 3.Scope形成作用域,概念类似于C++中的namespace,Java中的package. ...

  4. ASL Code中的_DSM方法

    一.HID I2C设备的"_DSM"方法 _DSM方法一共有4个参数,分别为Arg0.Arg1.Arg2.Arg3.该方法的具体定义以及每个参数的含义请参看ACPI 5.0规范的9 ...

  5. 二维码QR Code不是一个产品,是一个功能

    2019独角兽企业重金招聘Python工程师标准>>> 台湾有许多公司,开始跨入 QR Code 的相关应用,热度开始逐渐上升.最近有幸跟许多在这方面有兴趣的朋友们聊天,得到了很多的 ...

  6. python字节码执行函数_做一个字节码追踪器,从内部理解 Python 的执行过程

    最近我在研究 Python 的执行模型.我对 Python 内部的东西挺好奇,比如:类似 YIELDVALUE 和 YIELDFROM 此类操作码的实现:列表表达式.生成器表达式以及一些有趣的Pyth ...

  7. ACPI基础——ASL语言

    https://blog.csdn.net/jiangwei0512/article/details/54851544 ACPI Source Language 的缩写 ASL是一种源语言,用来定义A ...

  8. ACPI知识学习笔记

    ACPI table之FACP(Fixed ACPI Description Table). 在代码里面:Resources\AcpiTables\Fadt\Fadt3.0.act 定义了EFI_AC ...

  9. BIOS工程师需要掌握的知识

    ACPI规范: ACPI Specification 概述(基于ACPI_Spec_6_4_Jan22)_anqi8955的专栏-CSDN博客 ​​​​​​ACPI Specification 第一章 ...

最新文章

  1. 不止JDK7的HashMap,JDK8的ConcurrentHashMap也会造成CPU 100%
  2. jquery实现99乘法表的动态显示
  3. 面向对象原则之GOF是招式,九大原则才是精髓
  4. matlab三维feather,matlab高维图形,别地方抄来的
  5. 触发器及其应用实验报告总结_双面喷绘材料的分类及其应用,超全总结!(建议收藏)...
  6. ajax 数据 有序号,在ajax中添加序列号
  7. Python中使用xpath获取select option的每一行的text和value
  8. 第十一篇 浅拷贝和深拷贝
  9. 详解BetterZip对压缩包注释的一些相关小功能
  10. 小米网卡驱动linux,Linux 下小米WIFI 的无线网卡驱动
  11. SATA硬盘有固件问题的硬盘型号以及购买建议
  12. Review Board了解
  13. C语言输出大写金额,编程实现,输入一个人民币小写金额值,转化为大写金额值输出。先实现基本功能...
  14. JavaScript中浏览器兼容性解决办法
  15. 企业工商信息数据接口说明
  16. e430c参数 thinkpad,联想ThinkPad E430c的详细参数
  17. nii格式转化为png格式或者img格式
  18. js获取明天的年月日和计时器
  19. win10无法启动_常见的电脑故障分析:win10系统无法启动,造成的原因及解决教程...
  20. 戴尔笔记本无线网络无法连接

热门文章

  1. 阿里云ECS服务器开放端口号
  2. Java核心编程总结(三、多态与内部类),java就业班百度网盘
  3. adc0804c语言程序,ADC0804芯片在模数转换电路中的应用研究
  4. 一次腾讯云centos服务器被入侵的处理
  5. io获取 pcl_PCL:点云常用操作
  6. 零知识证明之范围证明的应用
  7. laydate使用详解
  8. Android Studio 飞机大战
  9. ThinkPad T470P 升级win10后指纹无法识别
  10. matlab安装包 知乎,知乎日报