UEFI开发探索64- VS2015调试UEFI代码(续27、53篇)

请保留-> 【原文:  https://blog.csdn.net/luobing4365 和 http://yiiyee.cn/blog/author/luobing/】

在27篇、53篇中,已经很详细地描述了如何建立调试环境。最近有些朋友问我,总是无法在VS2015下编译通过,所得到的信息也很奇怪,没法进行调试。

鉴于此,我觉得有必要再深入些,谈谈如何使用VS2015来调试UEFI代码。

我一般是遵循如下的原则来建立UEFI的VS调试环境的:

  1. 保证直接使用edksetup.bat和build工具,代码可以编译通过。VS有它自己的一套检测机制,并不适合UEFI工程。编译不通过时,它会提示找不到各种头文件,这些信息对我们毫无作用。简而言之,VS的调试工具,主要是为了找到代码无法如期运行的原因,不是为了寻找编译错误的;
  2. 调试IA32的程序,使用Nt32Pkg或者EmulatorPkg都行;调试X64程序,只能使用UDK2018之后的EmulatorPkg(具体哪个版本开始支持的不记得了,直接用2020版的branch吧)。除了必须硬件支持的程序,比如鼠标、PCIE卡等,我都是在模拟环境下调试的;
  3. 需要调试的工程,最好添加到模拟器所在Package的DSC文件中。这个步骤在53篇中描述过,操作的时候经常容易忘掉,我就是如此;
  4. 调试的时候,如果发现某些语句无法加载断点,或者直接就跳过去了;有些变量无法显示等。不要怀疑自己代码有问题,这一般是程序优化导致的结果。在编译选项中,将优化的开关关掉就可以了。

1 使用示例调试工程

本篇的博客中,提供了IA32和X64的调试工程模板,见篇末的指引。

X64dbg_vs是调试X64代码的,使用EmulatorPkg进行搭建。它使用模拟器WinHost运行程序,图1是使用我的EDK2环境搭建的(最新的EDK2):

图1 X64调试设置

每个人建立的目录可能不大相同,注意修改此处。另外,EmulatorPkg是之前就编译好了的。

在给出的调试示例工程中,针对需要调试的UEFI代码,需要修改X64dbg_vs.vcxproj,将其设置为自己要调试的代码。

图2 修改调试工程

在X64dbg_vs.vcxproj.filters中,可以添加调试工程的源文件指向,方便后面调试的时候看代码。当然,不直接修改,在打开Vs工程后,在工程视图中添加也是一样的。

另一个调试示例工程Nt32dbg_vs,是使用Nt32Pkg,调试32位UEFI程序的。这个调试示例我使用比较频繁,是在UDK2018的环境中搭建的。它的修改方法,和X64_dbg_vs是一样的,就不再重复了。

2 修改调试选项

在以前的博客中略微谈到过这个问题,编译器优化后导致无法查看变量,这个时候必须修改编译选项了。以下是我常用的几种编译选项(修改Conf\tool_def.txt):

#1 输出汇编源码的编译 luobing

#  DEBUG_VS2015x86_IA32_CC_FLAGS    = /nologo /arch:IA32 /c /WX /GS- /W4 /Gs32768 /D UNICODE /O1b2 /GL /FIAutoGen.h /EHs-c- /GR- /GF /Gy /Zi /Gm /Gw /FAs

#2 原始编译选项

#  DEBUG_VS2015x86_IA32_CC_FLAGS    = /nologo /arch:IA32 /c /WX /GS- /W4 /Gs32768 /D UNICODE /O1b2 /GL /FIAutoGen.h /EHs-c- /GR- /GF /Gy /Zi /Gm /Gw

#3 关闭优化开关

#  DEBUG_VS2015x86_IA32_CC_FLAGS    = /nologo /arch:IA32 /c /WX /GS- /W4 /Gs32768 /D UNICODE /FIAutoGen.h /EHs-c- /GR- /GF /Gy /Zi /Gm /Gw

#4 关闭优化开关且设置为W3级警告 脱胎自#3

  DEBUG_VS2015x86_IA32_CC_FLAGS    = /nologo /arch:IA32 /c /WX /GS- /W3 /Gs32768 /D UNICODE /FIAutoGen.h /EHs-c- /GR- /GF /Gy /Zi /Gm /Gw

优化开关是/O1b2,输出汇编代码是/FAs。这些编译选项,在之前的博客中已经详细描述过了。

祝调试愉快!

Gitee地址:https://gitee.com/luobing4365/uefi-exolorer
项目代码位于:/ 64 VS Debug Project下

81 total views, 4 views today

发表评论

电子邮件地址不会被公开。