调试篇 | 使用WinDbg Debug(上)

简介

在BIOS的代码中,主要由C和ASL两种语言组成,C语言最终编译成可以被处理器直接执行的机器码,而ASL则被编译成AML(ACPI Machine Language),是不能被处理器直接执行的,而是在OS中由AML解析器处理后运行。

在BIOS开发中,难免会遇到一些在Windows下蓝屏、死机等问题,由于此时BIOS代码已经结束,无法再通过常规的串口来查看OS运行的LOG,此时则可以使用微软提供AMLI调试器来进行DEBUG。

AMLI 调试器

Microsoft AMLI 调试器是一个可以调试 AML 代码的特殊调试工具。

在Windows 10 ,1803之前的Windows版本中,使用的是checked builds的ACPI 驱动(ACPI.sys),意味着在进行ACPI DEBUG的时候需要替换OS中的ACPI.sys文件,而后面的Windows版本已经不用这种方法了,无需替换,可以直接进行DEBUG。

环境搭建

工具准备

1.DEBUG线,如串口线、USB DEBUG(2.0或3.0)线等,下面以USB3.0线为例。

2.下载WinDbg

windbg下载有两种方法,一是下载SDK,然后单独安装windbg:https://developer.microsoft.com/zh-cn/windows/downloads/windows-sdk/

二是直接在应用商店搜索下载:

如果安装了VS或EWDK,也是带有此工具的,用Everything搜一下即可找到。

环境配置

WinDbg设置

Windows 调试器 (WinDbg) 可用于调试内核模式和用户模式代码、分析故障转储(如蓝屏时生成的dump文件)以及在代码执行时检查 CPU 寄存器。

使用windbg调试时需要用到程序的pbd文件,它存储在微软的服务器中,使用前需要正确设置服务器的地址,以便可以正常下载到本地,供windbg调用。

符号文件

符号文件(Symbol Files)是一个数据信息文件,它包含了应用程序二进制文件(比如:EXE、DLL等)调试信息,专门用来作调试之用,最终生成的可执行文件在运行时并不需要这个符号文件,但程序中所有的变量信息都记录在这个文件中。所以调试应用程序时,这个文件是非常重要的。用 Visual C++ 和 WinDbg 调试程序时都要用到这个文件。

在 Windows 系统中,符号文件以 .pdb 为扩展名,比如:每个 Windows 操作系统下有一个 GDI32.dll 文件,编译器在编译该 DLL 的时候会产生一个 GDI32.pdb 文件,一旦你拥有了这个 PDB 文件,那么便可以用它来调试并跟踪到 GDI32.dll 内部。该文件和二进制文件的编译版本密切相关,比如修改了 DLL 的输出函数,再编译该 DLL,那么原先的 PDB 文件就过时了,不能再用老的 PDB 文件来做调试工作,而必须使用最新的 PDB 文件版本。

设置方法

运行windbg,打开 File - Settings - Debugging settings

在Default symbol path填入:

c:\MySymbols
srv*c:\MySymbols*https://msdl.microsoft.com/download/symbols

目标机器设置

被调试的机器正常情况下是不支持调试的,需要设置打开调试模式,如果secure boot是启用的,可能还需要进BIOS Setup将它关闭,否则设置失败。

按下Ctrl + R,输入:msconfig,回车打开系统配置。一次打开:引导 - 高级选项,勾选“调试”,在调试端口处选择“USB”,USB目标名可以随意设置,如图示:

设置完重启即可生效。

确认USB DEBUG端口

并不是每个USB端口都支持调试的,需要找到支持的端口。做这一步需要用到一个叫做usbview的工具,它在SDK下载的windbg包中。

在目标机器运行usbview,可看到机器所有的USB端口,如下:

如果端口支持DEBUG,右侧中的"Is Port Debug Capable"则为Yes。

开始调试

1.目标机器打开调试模式后重启,然后用USB线将主机和目标机器连接起来,注意目标机器的USB端口是支持DEBUG的。

2.以管理员权限运行windbg,如果是首次启动,主机将会自动安装USB驱动。如果不以管理员权限运行,就需要手动安装驱动,而且还可能无法正常安装。

3.windbg依次打开File - start debugging - Attach to kernel,切换到USB选项卡,Target Name输入之前在目标机器打开调试模式时的USB目标名,则然后点击OK。

提示:Break on connection意思是当主机与目标机建立好连接的时候中断一下,然后可以输入命令,如打开ASL详细输出(若失败,先执行一次.reload命令):

!amli set spewon traceon verboseon

对于需要跟踪ASL这个设置非常有用。

首次进行WinDbg DEBUG时需要联网下载pdb文件,需要等待一段时间。正常连接后如下所示:

此时OS是处于正常运行状态,点击break可中断OS执行,然后可以通过命令设置windbg、读写当前状态的寄存器等。由于OS已经中断执行,此时在OS进行的任何操作都是没有响应的。如果要让OS继续执行,可以输入g或点击Go。

ACPI调试命令

!amli find Name

寻找ACPI 空间中某对象,如寻找_STA 方法

!amli dns [/s] [Name | Address]

显示一个命名空间对象,一般结合参数/s使用,用来显示指定对象下的子命名空间,如显示\_SB.BAT1下的子命名空间:

!amli u [ MethodName | CodeAddress ]

反汇编AML,如反汇编_BST:

!amli bp { MethodName | CodeAddress }

设置Method设置断点,如

!amli bl \_SB.BAT1._BST

以上便是几个常用的命令,其它命令可参阅WinDbg的帮助文档。

 

版权声明:
作者:bin
链接:https://ay123.net/mystudy/1420/
来源:爱影博客
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
海报
调试篇 | 使用WinDbg Debug(上)
简介 在BIOS的代码中,主要由C和ASL两种语言组成,C语言最终编译成可以被处理器直接执行的机器码,而ASL则被编译成AML(ACPI Machine Language),是不能被处……
<<上一篇
下一篇>>
文章目录
关闭
目 录