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 异常数据流如下图所示

../../_images/Debug_data_stream.png

Debug 异常数据流示意图

异常栈回溯

配置 backtrace 输出,或者配置死机埋点后,获取 backtrace 信息后,使用 addr2line 工具进行栈回溯

命令示例 riscv64-unknown-elf-addr2line -e acore/dbglog_demo_acore.elf 0x0200624a 0x04117d28

Debug 模块栈回溯 log 示意图

../../_images/Debug_backtrace_log.png

Debug 栈回溯 log 示意图

Debug 模块栈回溯处理如下截图所示

../../_images/Debug_backtrace.png

Debug 栈回溯示意图

coredump 内容解析

../../_images/Debug_dump.png

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 解析示意图如下所示

../../_images/Debug_gdb_analysis.png

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

Public Members

void (*debug_assert)(const char *file_name, uint32_t line)
void (*debug_assert_dump)(const char *file_name, uint32_t line, const uint32_t *dump_p, uint32_t dump_size)
void (*debug_init)(void)