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 提供共享内存的数据通信 用法流程 ---------- - 初始化 :cpp:func:`wq_debug_init` - 获取死机埋点信息 :cpp:func:`wq_debug_get_track_info` 结构图 ---------- Debug 模块各个 core 异常数据流如下图所示 .. image:: ../../../_static/Debug_data_stream.png :align: center .. centered:: Debug 异常数据流示意图 异常栈回溯 ---------- 配置 backtrace 输出,或者配置死机埋点后,获取 backtrace 信息后,使用 addr2line 工具进行栈回溯 命令示例 riscv64-unknown-elf-addr2line -e acore/dbglog_demo_acore.elf 0x0200624a 0x04117d28 Debug 模块栈回溯 log 示意图 .. image:: ../../../_static/Debug_backtrace_log.png :align: center .. centered:: Debug 栈回溯 log 示意图 Debug 模块栈回溯处理如下截图所示 .. image:: ../../../_static/Debug_backtrace.png :align: center .. centered:: Debug 栈回溯示意图 coredump 内容解析 -------------------- .. image:: ../../../_static/Debug_dump.png :align: center .. centered:: 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 解析示意图如下所示 .. image:: ../../../_static/Debug_gdb_analysis.png :align: center .. centered:: Debug gdb 解析示意图如下所示 API 介绍 ------------ .. doxygenfile:: wq_debug.h