3

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

 3 years ago
source link: http://yiiyee.cn/blog/2020/10/11/uefi%e5%bc%80%e5%8f%91%e6%8e%a2%e7%b4%a264-vs2015%e8%b0%83%e8%af%95uefi%e4%bb%a3%e7%a0%81%ef%bc%88%e7%bb%ad27%e3%80%8153%e7%af%87%ef%bc%89/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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下

336 total views, 2 views today

210c9a4d410d265665667a36fbe0f529?s=49&d=identicon&r=g作者 罗冰(Robin)发布于 2020年10月11日2020年10月11日分类 BIOS/UEFI


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK