请保留-> 【原文: https://blog.csdn.net/luobing4365 和 http://yiiyee.cn/blog/author/luobing/】
在开发网络代码的时候,光用Print打印信息不足以满足开发要求,必须源代码级别的跟踪。我所测试的环境,大部分是在TianCore的模拟环境下。因此,如何在这个环境中,实现源码级跟踪,成为了很迫切的需求。
当然,我可以在Linux下开发,使用Qemu+gdb的方式来调试。不过,每次都要编译好,然后拷贝到镜像文件中,再启动调试,略嫌麻烦。我还是希望能在Windows下,使用VS来调试。
之前的博客第27篇中,我已经介绍了如何使用Vs2015搭建UEFI调试环境。经过这几天的学习,发现之前的有些结论有点偏差,所以再写一篇作为补充。
以我的经验,使用Nt32Pkg编译出来的模拟环境,配合VS2015自带的调试器,能满足我至少90%以上的开发需求。除去那些必须要在硬件上调试,只能使用windbg/gdb进行双机调试之外,这是目前为止最好的调试方法了。
上一篇讨论Vs2015调试环境中,谈到使用AppPkg编译的代码,无法进行源代码级调试,这个结论有点问题。实际上,只要做一些调整,是可以解决这个问题的。
1 添加必要的文件
使用AppPkg编译的代码,很多时候需要使用StdLib的库,在Nt32Pkg中是没有包含的。解决方法也很简单,打开Nt32Pkg.dsc,在[Components]的末尾加上这行:
!include StdLib/StdLib.inc
编译的过程中,相关的库会自动编译好。
我的代码基本都在RobinPkg中,以其中的stdEchoUdp4为例(这是下一篇博客的例子),测试是否能在Nt32Pkg下编译。
首先在Nt32Pkg的[Components]中添加编译目标(最好拷贝在“MdeModulePkg/Application/HelloWorld/HelloWorld.inf”之后,方便寻找):
RobinPkg/Applications/stdEchoUdp4/stdEchoUdp4.inf
然后试着编译,编译命令如下:
C:\MyWorkspace> edksetup.bat
C:\MyWorkspace>build.bat -p Nt32Pkg\Nt32Pkg.dsc -a IA32 -m RobinPkg\Applications\stdEchoUdp4\stdEchoUdp4.inf
如果编译通过,说明添加成功了,可以继续下一步的工作。
2 建立VS2015工程文件
基本的步骤和第27篇介绍的过程相同,这里总结一下:
1) 建立VS的Makefile Project。建立的过程中,在Debug Configuration Settings中随便填写字符串,方便后面修改。如图:
2) 修改Vs的配置文件。打开vcxproj文件,找到Platform为Debug下的三个标签:<NmakeBuildCommandLine>、<NmakeBuildCommandLine>和<NMakeReBuildCommandLine>。
分别填入下面命令:
cd /D C:\MyWorkspace
set WORKSPACE=C:\MyWorkspace
call edksetup.bat –nt32
call build.bat -p Nt32Pkg\Nt32Pkg.dsc -a IA32 -m RobinPkg\Applications\stdEchoUdp4\stdEchoUdp4.inf -b DEBUG -n 100 –log=build.log
cd /D C:\MyWorkspace
set WORKSPACE=C:\MyWorkspace
call edksetup.bat –nt32
call build.bat -p Nt32Pkg\Nt32Pkg.dsc -a IA32 -m RobinPkg\Applications\stdEchoUdp4\stdEchoUdp4.inf -b DEBUG -n 100 –log=build.log clean
cd /D C:\MyWorkspace
set WORKSPACE=C:\MyWorkspace
call edksetup.bat –nt32
call build.bat -p Nt32Pkg\Nt32Pkg.dsc -a IA32 -m RobinPkg\Applications\stdEchoUdp4\stdEchoUdp4.inf -b DEBUG -n 100 –log=build.log clean
call build.bat -p Nt32Pkg\Nt32Pkg.dsc -a IA32 -m RobinPkg\Applications\stdEchoUdp4\stdEchoUdp4.inf -b DEBUG -n 100 –log=build.log
填写后的示意图如下:
3) 修改Debugging配置参数。
打开vs工程文件的属性页,在Debugging选项下,将Command段填入“SecMain.exe”,Working Directory段填入“C:\MyWorkspace\Build\NT32IA32\DEBUG_VS2015x86\IA32\”。
填写完成后,为方便后续调试,可以把相关的源文件添加到工程中。示意图如下:
至此,调试换就搭建完毕了。按F5将重新编译代码,并启动调试器。在需要调试的位置下断点,就可以调试代码了。
3 调试
微软的编译器做得确实很好,符号、函数栈等,都很容易查看。如下图:
有了如此方便的调试工具,在UEFI的世界中感觉拥有了上帝之眼,再奇怪的问题,只要有耐心,都能通过工具读懂问题关键所在。祝各位调试愉快!
2,335 total views, 2 views today