Debug
概述
Debug 模块提供发生 panic 后调试信息生成保存功能
功能特性
提供其他 core 数据异常定位的功能。
程序 assert 会触发 dump 信息。
提供多个宏定义配置
宏定义配置说明
CONFIG_DEBUG_REG_DUMP_OUTPUT_DISABLE 默认输出寄存器信息,若不需要,打开此宏定义
CONFIG_DEBUG_BACKTRACE_OUTPUT_DISABLE 默认输出回溯信息,若不需要,打开此宏定义
CONFIG_DEBUG_DUMP_OUTPUT_ENABLE 打开debug模块输出配置
CONFIG_DEBUG_DUMP_MODE_UART_OR_FLASH 配置debug模块输出方式,现在只支持uart,默认也是uart输出,宏值为0为uart输出
CONFIG_DEBUG_DUMP_FULL_OR_MINI 配置debug模块全量输出或者最小输出,默认全量输出,宏值为0 为全量输出,宏值为1为最小输出
CONFIG_DEBUG_CRASH_RESET_DISABLE 默认debug信息输出完,程序复位,若不需要复位,打开此宏定义
CONFIG_DEBUG_TRACING_ENABLE 配置死机埋点
资源依赖
依赖 IPC 提供核间通信
依赖 semaphore 提供同步
依赖 generic_transmission 提供共享内存的数据通信
用法流程
初始化
wq_debug_init()获取死机埋点信息
wq_debug_get_track_info()
结构图
Debug 模块各个 core 异常数据流如下图所示
Debug 异常数据流示意图
异常栈回溯
配置 backtrace 输出,或者配置死机埋点后,获取 backtrace 信息后,使用 addr2line 工具进行栈回溯
命令示例 riscv64-unknown-elf-addr2line -e acore/dbglog_demo_acore.elf 0x0200624a 0x04117d28
Debug 模块栈回溯 log 示意图
Debug 栈回溯 log 示意图
Debug 模块栈回溯处理如下截图所示
Debug 栈回溯示意图
coredump 内容解析
Debug dump 示意图
如上 dump 示例图,Coredump 输出到串口后,找到"==============CORE0 DUMP START==============="和"================CORE0 DUMP END================="
可以通过 python3 wq_coredump_logfile_extract.py -f ./test.log -no 1 来获取转储信息, 会生成 test.b64 转储文件
也可通过去除左侧的时间戳后(可用 vscode (.*])正则替换去除),截取中间的内容,即获取程序异常时刻的转储信息
截取后,另存到新的文本,并将文本后缀重命名为 .b64,如 tws.b64
wq_coredump.py 工具在 tools/scripts 目录,提供 dbg_corefile 和 info_corefile 两个命令
info_corefile 打印崩溃任务的寄存器、调用堆栈、系统中可用任务的列表、内存区域和存储在核心转储(TCB 和堆栈)中的内存内容,命令与下述示例 dbg_corefile 命令类同
dbg_corefile 创建核心转储 ELF 文件,并使用该文件运行 GDB 调试会话.用户可以手动检查内存、变量和任务状态(由于并非所有内存都保存在核心转储中,因此只有在堆栈上分配的变量的值才有意义)
解析命令为 python3 wq_coredump.py dbg_corefile --gdb riscv64-unknown-elf-gdb -c ./tws.b64 -t b64 ./tws_acore.elf
其中 —gdb 指定 gdb 路径,-c 指定 dump 文件路径,-t b64 表示是 base64 格式文件,最后是出异常的 elf 程序文件
对于xcc编译出的程序,和 riscv 类似,只需将上述命令中的 riscv64-unknown-elf-gdb 改成 xt-gdb 即可,其他的流程和 riscv 完全一致
gdb 解析示意图如下所示
Debug gdb 解析示意图如下所示
API 介绍
Defines
-
WQ_DEBUG_ASSERT_DUMP_FUN_MAX
max dump functions when assert happened
Typedefs
-
typedef void (*wq_debug_log_print_t)(const char *fmt, ...)
This function is to print debug information.
- Param fmt:
variable parameters
-
typedef void (*wq_debug_assert_dump_fun_t)(wq_debug_log_print_t cb)
This function is to dump debug information when assert heppened.
- Param cb:
callback function
Functions
-
void wq_debug_get_stack_trace(unsigned int sp)
This function is to trace & dump function call based on stack.
- 参数:
sp -- is the task stack pointer.
-
wq_debug_assert_dump_fun_t *wq_debug_get_assert_dump_fun_ptr(void)
This function is to get debug assert dump function pointer.
- 返回:
pointer.
-
WQ_RET wq_debug_reg_assert_dump_fun(wq_debug_assert_dump_fun_t fn)
This function is used to regisiter an assert dump function.
- 参数:
fn -- is assert dump function pointer.
- 返回:
WQ_RET is error nu.
-
void wq_debug_assert(const char *file_name, uint32_t line)
This function is used to assert for debug.
- 参数:
file_name -- is debug file name.
line -- is debug line.
-
void wq_debug_init(void)
This function is used to init debug.
-
void wq_debug_assert_dump(const char *file_name, uint32_t line, const uint32_t *dump_p, uint32_t dump_size)
This function is used to assert dump for debug.
- 参数:
file_name -- is debug file name.
line -- is debug line.
dump_p -- is debug dump pointer of start address.
dump_size -- is debug dump size.
-
struct debug_ctrl