匿名
未登录
登录
百问网嵌入式Linux wiki
搜索
查看“U-Boot - How to debug”的源代码
来自百问网嵌入式Linux wiki
名字空间
页面
讨论
更多
更多
页面选项
Read
查看源代码
历史
←
U-Boot - How to debug
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看与复制此页面的源代码。
== Debug with console == 跟踪和错误在设备树的'''chosen''' 节点中通过 '''stdout-path''' 字段定义的控制台上可用,例如在serial0 = uart4上: chosen { stdout-path = " {{Highlight|serial0}}:115200n8"; }; aliases { {{Highlight|serial0}} = &{{Highlight|uart4}}; }; 默认情况下,U-Boot使用的宏 (debug(), pr_debug()...)不打印任何跟踪;要激活特定文件上的调试跟踪,需要启用 '''DEBUG''' 编译标志并更改文件的LOGLEVEL: * 在<file>.c文件包含任何之前定义调试 #define DEBUG #undef CONFIG_LOGLEVEL #define CONFIG_LOGLEVEL 8 * 使用 Makefile CFLAGS_<file>.o+= -DDEBUG -DCONFIG_LOGLEVEL=8 如果在配置控制台之前(在执行U-Boot的第一阶段)U-Boot失败,则跟踪不可用。 在这种情况下,您需要: * 用GDB调试 (请参阅下一章) 或, * 激活调试UART功能: ** 在[[U-Boot_overview#U-Boot_configuration|U-Boot configuration]]的defconfig中添加 *** {{Highlight|CONFIG_DEBUG_UART}} *** {{Highlight|CONFIG_DEBUG_UART_STM32}} ** adpat 这个函数 {{Highlight|board_debug_uart_init()}}: 在通过U-Boot驱动程序初始化之前配置所需的资源 (pad, clock)。<br/>此功能需要针对您的主板进行调整。 == Debug with GDB == 在OpenSTLinux中,可以直接使用GDB脚本Setup.gdb: * [[GDB#U-Boot_execution_phase]] * [[GDB#U-Boot_boot_case]] 或者对于手动GDB连接,您需要: # 获取U-Boot和/或SPL的[[U-Boot_overview#Output_files|elf files]] <br/>(构建目录中提供了u-boot和u-boot-spl) # 将[[GDB]]连接到目标 # 使用 gdb{{Highlight|"monitor reset halt"}}命令'''reset with attach'''复位目标:<br/>在ROM代码中或在FSBL执行开始时停止执行。 # 加载二进制文件的符号,以便在下一章中用可用的命令进行调试:<br/>[[#Load U-Boot symbol]], [[#Load SPL symbol]], [[#Load SPL code and debug]] # 使用 {{Highlight|"continue"}} 命令开始执行。 === Load U-Boot symbol === 使用[[U-Boot_overview#U-Boot_phases|U-Boot relocation]]时,符号更难加载。 请参阅 https://www.denx.de/wiki/DULG/DebuggingUBoot 如果在运行的目标上连接GDB,则可以加载调试符号: * 在使用 {{Highlight|"symbol-file"}} 命令进行重定位之前: {{GDB$}} {{Highlight|symbol-file u-boot}} * 使用{{Highlight|"add-symbol-file"}} 命令重定位后,使用代码 offset = gd->relocaddr 重定位该符号: {{GDB$}} symbol-file u-boot {{Highlight|--> only for "gd_t" definition}} {{GDB$}} set $offset = ((gd_t *)$r9)->relocaddr {{Highlight|--> get relocation offset}} {{GDB$}} symbol-file {{Highlight|--> clear previous symbol }} {{GDB$}} {{Highlight|add-symbol-file u-boot $offset}} 以下GDB示例脚本在{{Highlight|"monitor reset halt"}} 命令之后,在为编程板重定位前后自动加载U-Boot符号: {{GDB$}} thbreak *0xC0100000 {{GDB$}} commands > symbol-file u-boot > thbreak relocate_code > commands > print "RELOCATE U-Boot..." > set $offset = ((gd_t *)$r9)->relocaddr > print $offset > symbol-file > add-symbol-file u-boot $offset > thbreak boot_jump_linux > continue > end > continue > end 当通过U-Boot入口点(CONFIG_SYS_TEXT_BASE = 0xC0100000)处的FSBL=TF-A或SPL将U-Boot代码加载到DDR中时,此脚本使用临时硬件断点{{Highlight|"thbreak"}} 加载符号。 它只允许在执行代码时加载符号,以避免在DDR初始化之前访问DDR。 === Load SPL symbol === 要在闪存设备上使用GDB调试SPL,ROM代码加载二进制文件,GDB脚本只加载SPL符号: {{GDB$}} symbol-file u-boot-spl === Load SPL code and debug === 有时,您需要在未编程的目标上调试SPL执行(例如,用于电路板启动),因此您可以使用GDB将SPL代码加载到嵌入式RAM中并执行。 在ROM代码中停止执行时,您需要执行{{Highlight|"load"}}命令,具体取决于 [[U-Boot_overview#Device_tree|U-Boot device tree]] 中定义的编译标志来加载SPL代码和关联的设备树: * CONFIG_OF_SEPARATE = dtb 附加在代码末尾,不存在于elf文件中(默认配置) {{GDB$}} file u-boot-spl {{GDB$}} load {{GDB$}} set $dtb = __bss_end {{GDB$}} restore spl/dt.dtb binary $dtb * CONFIG_OF_EMBED = dtb 嵌入elf文件中(调试配置) {{GDB$}} file u-boot-spl {{GDB$}} load === Debug the first SPL instructions === 有时,在第一条指令之后,gdb命令 "monitor reset halt" 会停止SPL代码的执行。 要调试这部分代码,可以修改代码:在SPL代码中添加一个无限循环以等待gdb连接。 例如,在{{CodeSource | U-Boot | arch/arm/mach-stm32mp/spl.c}}中 : <syntaxhighlight lang="c"> void board_init_f(ulong dummy) { struct udevice *dev; int ret; /* volatile is needed to avoid gcc optimization */ volatile int stop = 0; /* infinite debug loop */ while ( !stop ) ; arch_cpu_init(); </syntaxhighlight> 当连接gdb并加载SPL符号时,无限循环会因以下原因中断: {{GDB$}} set var stop=1 您可以通过gdb命令调试SPL first指令。
该页面使用的模板:
模板:CodeSource
(
查看源代码
)
模板:GDB$
(
查看源代码
)
模板:Highlight
(
查看源代码
)
返回至
U-Boot - How to debug
。
导航
导航
WIKI首页
官方店铺
资料下载
交流社区
所有页面
所有产品
MPU-Linux开发板
MCU-单片机开发板
Linux开发系列视频
单片机开发系列视频
所有模块配件
Wiki工具
Wiki工具
特殊页面
页面工具
页面工具
用户页面工具
更多
链入页面
相关更改
页面信息
页面日志