Tracking ACPI/ASL Using WinDbg

本文详细介绍如何使用WinDbg进行ACPI/ASL代码级调试。从调试环境搭建到实际案例操作,涵盖配置Debugger与Debuggee、安装Symbol File及CheckedAcpi.sys等步骤,并通过实例展示ACPI调试技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 http://blog.youkuaiyun.com/hgf1011/archive/2009/02/12/3881848.aspx

 

Tracking ACPI/ASL Using WinDbg

 

1. Preface

 

      ACPIBIOSOS之间沟通的主要手段,所以有些系统相关的问题,都跟ACPI asl code有很大的关系,如果能够直Debug ACPI asl code那将会对解决这类问题提供很好的帮助。这篇文章的目的就是讲解如何使用WinDbg实现ACPI/ASL code源码级别的调试。  

 

2. Configuration of Debugger & Debuggee

 

     Debug ACPI 最好是双机调试,一台主机Debugger和一台目标机器DebuggeeWinDbg支援COM1394USB2.0三种不同的连接方式。它们的配置方法都大同小异,我使用的1394,所以我将介绍1394的配置方式。

a)    设置Debuggee为调试模式

启动Debuggee进入OS,点击开始菜单选择运行,然后输入msconfig然后选择BOOT.INIèAdvanced Optionsè/DEBUG剩下的具体方式如下图1所示,其中/CHANEL选择可以随便指定,但是要和Debugger端设置的要一致。

 

                                                           

 

1

b)    安装设置WinDbg

WinDbg是微软提供的免费的Debug工具(微软还是不错的J,它非常强大,可以调试各种程序包括ACPIDriverAP而且它甚至可以用于Windows OS Kernel Debug,据说微软自己也使用 该程式辅助开发他们的OS, WinDbg在微软网站上有免费下载。如果你在别的机器上已经安装好了WinDbg,那么可以直接copy过来就能使用了。

c)    安装Symbol File

什么是symbol文件呢?Symbol文件包含了被调试程序的变量名称,函数名,入口地址以及代码行号等信息。通常以pdb为扩展名。为了能调试debuggeedebugger端使用的Symbol文件一定要和目标机上安装的操作系统的版本要一致。Symbol文件对于WinDbg来说是至关重要的,如果找不到正确的Symbol文件,调试功能就没法使用。安装完Symbol以后Ctrl + S   设置WinDbg Symbol路径例如:SRV*C:/Symbols*C:/WINNT/Symbols*http://msdl.microsoft.com/download/symbols。最好把微软的Symbols 服务器也写上这样比较保险。WindowsSymbol文件可以在微软网站上免费下载

d)    安装Checked Acpi.sys

BIOS中的ASL code通过asl.exe这个程序转化为aml文件,进入OS以后,OS通过两个inboxdriver Acpi.sys Smbios.sys解释和执行aml code。而且微软还提供了一个调试工具专门用于调试aml code,它就是Microsoft AMLI Debugger。这个Debugger需要两部分配合才能工作,一部分内建于WinDbg,另一部分则需要Checked Acpi.sys。所以如果要调试ACPI asl code,就必须要安装checked Acpi.sysSymbol文件一样Checked Acpi.sys一定要和目标机安装的操作系统版本要一致。替换debuggeesystem32/drivers下的 Acpi.sys,一定要进入安全模式,如果不仅安全模式你会很惨哦J      

e)    Start Kernel Debug

打开WinDbg选择FileèKernel Debugè1394(channel 1)èOK

如下图2所示:

 

                                                          2

接下来的动作就是Ctrl+Break,断下DebuggeeOS,然后就会出现如下图3所示的界面,这时就可以开始下断点,跟踪程式,查看程式的上下文,查看寄存器的值等等。想干嘛,随你的便J!

 

                                  

           3

 

3.    Let’s Begin Fighting It

 

       空谈误国,实战兴邦。罗嗦了这么多废话,现在要开始行动了。首先我们要先输入!amli debugger 启动amli调试器,第一次可能会失败,报下述错误:AMLI_DBGERR: failed to get debugger flag address。这个错误的原因可能是:

1.     Checked Acpi.sysAcpi.pdb文件和debuggee版本不符导致的。

2.  WinDbg没有load Acpi符号文件,只要.reload即可。

下面我将给出几个小的sample,演示如何debug asl code

a)    Dump Acpi namespace device objects

输入!amli dns /s /_sb.pci0.sbrg.ec 在我的调试环境下将会出现下述内如图4所示,/_sb.pci0.sbrg.ec这是Acpi device Object 路径,每个bios的实现可能不同,这里是我的debuggeeEC这个device的路径。嘿嘿怎么样,EC的秘密一览无余了吧。

                                                     4

b)    Set breakpoints in Acpi method

输入!amli debugger ègo,然后一旦aml被解释WinDbg就会被断下,这时我们再输入!amli bp/_sb.pci0.sbrg.ec.bat1. _staègo这时我们就在battery _sta这个method下了个断点,一旦该methodcall,那么我们就会hit the breakpoint。那么该方法什么时候会被call呢?Acpi spec有如下描述:

 

 

 

                                      5

也就是说一旦有device插拔动作该method就会被call,那么我们拔掉battery试试看会怎么样呢?下图6给出了答案,我们的断点被hit了。

 

     

 

                                                6

被断下以后我们可以在WinDbg查看各种信息,例如使用r检查上下文信息,ln列出breakpoints最近的methodp单步查看各个参数的值等等,help yourselfJ

 

c)    Tracking processes of S3/4/5

我一直不清楚当osS3/4/5的时候流程是怎样?会执行哪些  asl code而且我们又时不时的会碰到与之相关的问题,烦不胜烦。怎么办呢?Let’s scratch it。输入!amli debugger ègo,下来输入 set verboseon èset traceonègo,然后我们选择让debuggee 关机进入S5WinDbg将会出现下图7类似的输出。这些就是下S5 Acpi asl code的完整process。我们发现OS先会去获得一些AC,BAT,LID等设备的信息,然后会call /_PTS(0x5) method 0x5就表示S5S5追过了,S3/S4那就如法炮制。

            

              7

REFF:

1.     如何跟踪ACPI代码

2.     如何使用WinDbg跟踪调试ASL/ACPI?

<think>好的,我现在需要解决用户遇到的链接器错误,找不到库 -lmessage_filters 的问题。用户是在使用ROS时,通过catkin_make编译时出现的这个错误。首先,我得回忆一下常见的导致这类错误的原因,以及可能的解决方法。 首先,链接器找不到-lmessage_filters,说明在链接阶段,系统无法找到名为libmessage_filters.so的库文件。可能的原因有几个: 1. **库未安装**:用户可能没有安装包含message_filters库的ROS包。message_filters是ROS的一个常用库,属于roscpp的一部分,通常在ros-melodic-rosconsole这样的包中,但具体可能因ROS版本而异。例如,在ROS Noetic中,对应的包可能是ros-noetic-message-filters。 2. **路径问题**:虽然库已安装,但编译系统(如catkin)没有正确找到库的路径。这可能是因为库所在的目录没有添加到链接器的搜索路径中,或者CMakeLists.txt中未正确指定依赖项。 3. **版本冲突**:可能存在多个版本的库,导致链接器选择了错误的版本,或者库文件本身损坏。 接下来,我需要根据这些可能性,一步步引导用户进行排查。 首先,用户应该检查是否安装了包含message_filters的ROS包。在Ubuntu系统中,可以使用apt命令查询是否已安装。例如,运行`dpkg -l | grep message-filters`或者使用`apt search message-filters`来查找正确的包名。如果未安装,用户需要安装对应的包,比如在Melodic下安装`ros-melodic-message-filters`,在Noetic下安装`ros-noetic-message-filters`。 其次,如果库已安装,需要确认库文件的位置。通常,ROS的库会安装在`/opt/ros/<distro>/lib`目录下。用户可以使用`find`或`locate`命令来查找libmessage_filters.so的位置。例如,执行`find /opt/ros/ -name "libmessage_filters.so"`。如果找到,需要确保该路径包含在链接器的搜索路径中,或者在CMakeLists.txt中正确设置。 接下来,检查用户的CMakeLists.txt文件是否正确配置。用户需要在find_package中包含相应的依赖,比如`find_package(catkin REQUIRED COMPONENTS roscpp message_filters ...)`,然后在target_link_libraries中添加${catkin_LIBRARIES}或者直接添加message_filters。如果依赖项没有正确声明,链接器将无法找到库。 另外,用户可能需要检查环境变量,如LD_LIBRARY_PATH是否包含ROS库的路径。不过,在ROS工作空间中,通常通过source devel/setup.bash来设置环境,这可能不需要手动调整。 如果以上步骤都正确,但问题依旧,可能需要重新安装相关包,或者重新构建整个工作空间。有时候,库文件可能损坏,或者编译过程中出现错误,导致库未正确生成。用户可以尝试删除build和devel目录后重新运行catkin_make。 还有一种可能性是用户的工作空间与其他安装的库有冲突,比如同时存在多个ROS版本,或者手动安装的库与系统包冲突。需要确保所有依赖项版本一致,并且路径正确。 总结解决步骤应该是: 1. 确认message_filters库是否安装。 2. 检查库文件路径是否正确。 3. 检查CMakeLists.txt配置。 4. 确保环境变量正确。 5. 清理并重新编译。 6. 处理可能的依赖冲突。 在回答时,需要分步骤说明,并给出具体的命令示例,方便用户操作。同时,引用提供的参考中提到的类似问题,如引用[3]提到的重新编译安装库的方法,可能适用于此处,但需要根据实际情况调整。</think>针对编译ROS项目时出现`ld: cannot find -lmessage_filters`的链接错误,以下是分步解决方案: --- ### **1. 验证message_filters库是否安装** 该库属于`ros-<distro>-message-filters`包(例如:`ros-noetic-message-filters`或`ros-melodic-message-filters`)。 **操作步骤:** ```bash # 检查是否已安装(替换<distro>为你的ROS版本,如noetic) dpkg -l | grep ros-<distro>-message-filters # 若未安装,通过apt安装 sudo apt install ros-<distro>-message-filters ``` --- ### **2. 定位库文件路径** 确认库文件`libmessage_filters.so`存在于系统路径中。 **操作步骤:** ```bash # 搜索库文件路径(替换<distro>为你的ROS版本) find /opt/ros/<distro>/ -name "libmessage_filters.so" # 典型路径示例: # /opt/ros/noetic/lib/libmessage_filters.so ``` --- ### **3. 配置CMakeLists.txt** 确保在`CMakeLists.txt`中正确声明依赖项。 **修改建议:** ```cmake # 在find_package中添加message_filters find_package(catkin REQUIRED COMPONENTS roscpp message_filters # 确保包含此依赖 ... ) # 在target_link_libraries中链接库 target_link_libraries(your_node ${catkin_LIBRARIES} ) ``` --- ### **4. 检查编译环境** 确保ROS环境变量已加载,并清理旧编译文件。 **操作步骤:** ```bash # 加载环境变量(替换<distro>) source /opt/ros/<distro>/setup.bash # 清理工作空间后重新编译 cd ~/catkin_ws rm -rf build devel catkin_make ``` --- ### **5. 处理版本冲突** 若存在多版本ROS或手动安装的库,可能导致路径冲突。 **解决方案:** - 卸载冲突的手动安装库(如自行编译的PCL/VTK)。 - 确保所有依赖通过`apt`安装,保持版本一致性[^3]。 --- ### **典型错误场景** - **未安装库**:直接通过`apt`安装即可解决。 - **CMake配置遗漏**:补全`message_filters`依赖声明。 - **环境未加载**:每次编译前需执行`source /opt/ros/<distro>/setup.bash`。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值