Debug VS Trace
Debug(Static)
- Run - Control(Break,Halt,Go)
- Code Walking(stepping and running to a break)
Trace(Dynamic)
- Root causing more obscure(hard to find) bugs
- These are the few bugs that really blow up the schedule
- Finding these bugs is where Trace shines
Requirements for Hardware
现在的X86变得日益复杂,如何进行有效的Debug 也日渐成为一个难题。为此 Intel 在芯片组或者 CPU 上预留了一个称作DCI (Intel® Direct Connect Interface)的Debug 接口。这个接口使用 USB 3.0一模一样的外部连接。CPU 内部有切换器,当Chipset 发现外部有设备和他握手,就将原本的USB信号切换为DCI 的信号。这样无需额外的预留就能实现Debug
在DCI 出现之前,Intel 使用JTAG 接口。当时的 Debug 盒子叫做 In-Target Proble,简称 ITP。为了Debug,主板上同时必须预留JTAG接口。显而易见,说服HW工程师在主板上预留这样的接口需要花费极大的口舌,至于在量产板子上焊接这样的接口几乎是不可能的事情。因此,串口一直是BIOS工程师的最爱
现在的Debug 盒子全称是“Intel SVT Closed Chassis Adapter”,缩写 “CCA”(Intel Silicon View Technology Closed Chassis Adapter), 更通俗称DCI 蓝盒子
除此之外还有长得类似 WinDBG 线的 DbC( debug class 线),同样是插在 USB 3.0 口上就能进行Debug
Requirements For Software
基本开发运行环境
- Python
- GIT
- C/C++运行环境
- JRE
Source Level Debugger应用场景
- 实际硬件支持的CRB或OEM BOARD Project(侧重解bug)
AMI VEB OR Intel System Debugger
- edk2内核Source(侧重追内核实现code,测试开发Tools)
EmulatorPkg(VSCode + Visual Studio)
OvmfPkg(QEMU + udk_debugger_tool + windbg)
Demo For AMI Veb Trace Hub Debugger
Connect Target和Host
(Intel)Comet Lake Platform ,Target端连上USB2.0或者3.0的Port,不一定都可以,可以看调试器DCI CONNECT指示灯来判定
SVN导入相关Modules
Release Project Code一般会拿掉Debug相关的Modules,要支持Veb Trace Hub Function,Source Code要导入Debugger和DebuggerCollaterals Module,可以查看相关CHM文件,注意两个Module Version之间的Dependency,查看AMI_Debug_for_Trace_Hub_User_Manual_NDA.pdf知道是否Support对应Platform的DEBUG和Trace以及Guide.
NDACollaterals配置
安装CCA Debug Driver和Install.exe导入Trace Hub相关scripts到对应版本的Veb目录下,注意目前只Support JRE8,如果安装其它版本的JDK或者JRE并设置了环境变量,有遇到过Debug_loader报错的情况,可以用VisualeBiosWithJRE目录下的veb
BIOS Setup Settings
Target需要修改如下items setting,或者Host build source code时直接修改debugsetup.hfr,避免调Target端item settings,因为有的Project会隐藏CRB默认的items,需要Tool set bit位来调出
Trace Hub Enable Mode : Advanced -> Debug Settings -> Advanced Debug Settings -> PCH Trace Hub Enable Mode(Host Debugger)
Platform Debug Consent : Advanced -> Debug Settings -> Platform Debug Consent(Enabled(DCI OOB + [Dbc]))
```
oneof varid = PCH_SETUP.PchTraceHubMode,
prompt = STRING_TOKEN(STR_PCH_TRACE_HUB_PROMPT),
help = STRING_TOKEN(STR_TRACE_HUB_MODE_HELP),
option text = STRING_TOKEN(STR_DISABLED), value = 0, flags = RESET_REQUIRED;
option text = STRING_TOKEN(STR_TRACE_HUB_TARGET_DEBUGGER), value = 1, flags = RESET_REQUIRED;
option text = STRING_TOKEN(STR_TRACE_HUB_HOST_DEBUGGER), value = 2, flags = DEFAULT | MANUFACTURING | RESET_REQUIRED;
endoneof;
TOKEN
Name = "PLATFORM_DEBUG_CONSENT_DEFAULT"
Value = "1"
Help = "Default value of Platform Debug Consent for Trace Hub. 0:Disabled / 1:DCI OOB+[DbC] / 2:DCI OOB / 3:USB3 DbC / 4:XDP/MIPI60 / 5:USB2 DbC"
TokenType = Integer
TargetMAK = Yes
TargetH = Yes
End
Build Token Settings
“DEBUG_MODE” Enabled
**”AmiTraceHubDebugger_Support “ Enabled **
“PLATFORM_DEBUG_CONSENT_DEFAULT” 1
导入证书
对应路径Help -> Mange Debugger License,证书需要获得AMI授权
配置Trace Hub Options
需要根据硬件调试工具连接方式选取对应 Hardware Probe,Platform Processor和Platform PCH也都需要对应上,如果列表没有合适的选项可以对应,会出现Target端Detected不到的情况,可以尝试更新DebuggerCollaterals Module获取最新Support的Lists或者与Module Owner确认
配置Xml
对应Board 的XML需要Enabled如下设置
Trace Hub Debugging
Flash Full Bin to Target and Start Trace Hub Debugging,Loaded Driver View视图中可以看到依次加载的Module,此时寻找感兴趣的Module或者可疑的点,可以下断点调试,View call stack、Memory、Variable、Expression、Disassembly、Register、Console Log and so on.
Demo for Intel system debugger
会遇到有些平台AMI VEB还不支持,但Intel System Debuger可以跟进源码,软件调试时使用上大同小异,可以参照Help文档或者寻求Intel的Support
Connection
Debug Configuration
设为单线程方便Halt,加入需要Debug的Source的路径
Launch and Debugging
Demo for edk2内核源码
代码部署
github下载较慢,通过代理挂在美国的节点会快点,也可通过gitee平台,备份edk2和submoulde仓库再进行update
- 此时需要修改根目录下.gitmodules为对应路径
编译相关Tool部署
推荐都放在C盘根目录,并设置环境变量,不然需要修改tools_def.txt,edksetup.bat的Tool路径
- 不设置环境变量,修改Tool路径做法
编译edk2 EmulatorPkg
- edksetup.bat rebuild //重新获取配置的环境变量,会在Conf目录下建立target.txt,Tools_def.txt等文件
- build -t VS2017 -a IA32 -y Report.txt //-t 指定ToolChain -a 指定TargetArch -y 生成格式化的Report.txt
调试edk2(执行Winhost.exe)
- 在需要调试代码处加上CpuBreakpoint(),并修改注册表如下,触发异常会调出Visual Studio作为调试器