请保留-> 【原文: https://blog.csdn.net/luobing4365 和 http://yiiyee.cn/blog/author/luobing/】
在27篇、53篇中,已经很详细地描述了如何建立调试环境。最近有些朋友问我,总是无法在VS2015下编译通过,所得到的信息也很奇怪,没法进行调试。
鉴于此,我觉得有必要再深入些,谈谈如何使用VS2015来调试UEFI代码。
我一般是遵循如下的原则来建立UEFI的VS调试环境的:
- 保证直接使用edksetup.bat和build工具,代码可以编译通过。VS有它自己的一套检测机制,并不适合UEFI工程。编译不通过时,它会提示找不到各种头文件,这些信息对我们毫无作用。简而言之,VS的调试工具,主要是为了找到代码无法如期运行的原因,不是为了寻找编译错误的;
- 调试IA32的程序,使用Nt32Pkg或者EmulatorPkg都行;调试X64程序,只能使用UDK2018之后的EmulatorPkg(具体哪个版本开始支持的不记得了,直接用2020版的branch吧)。除了必须硬件支持的程序,比如鼠标、PCIE卡等,我都是在模拟环境下调试的;
- 需要调试的工程,最好添加到模拟器所在Package的DSC文件中。这个步骤在53篇中描述过,操作的时候经常容易忘掉,我就是如此;
- 调试的时候,如果发现某些语句无法加载断点,或者直接就跳过去了;有些变量无法显示等。不要怀疑自己代码有问题,这一般是程序优化导致的结果。在编译选项中,将优化的开关关掉就可以了。
1 使用示例调试工程
本篇的博客中,提供了IA32和X64的调试工程模板,见篇末的指引。
X64dbg_vs是调试X64代码的,使用EmulatorPkg进行搭建。它使用模拟器WinHost运行程序,图1是使用我的EDK2环境搭建的(最新的EDK2):
每个人建立的目录可能不大相同,注意修改此处。另外,EmulatorPkg是之前就编译好了的。
在给出的调试示例工程中,针对需要调试的UEFI代码,需要修改X64dbg_vs.vcxproj,将其设置为自己要调试的代码。
在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-explorer
项目代码位于:/ 64 VS Debug Project下
2,335 total views, 2 views today