Source Level Debug


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

Intel Debug Tools

现在的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作为调试器

Start Debugging


文章作者: Holy Chen
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Holy Chen !
  目录