RTOS 调试指南
此文档介绍 FreeRTOS 系统方案支持的常用软件调试方法,帮助相关开发人员快速高效地进行软件调试,提高解决软件问题的效率。
栈回溯
栈回溯是指获取程序的调用链信息,通过栈回溯信息,能帮助开发者快速理清程序执行流程,提高分析问题的效率。
用途
- 获取程序调用关系,理清程序执行流程。
- 在系统触发异常时,快速分析异常所在位置及其调用链。
- 在分析某任务卡死原因时,可以通过对该任务进行栈回溯,快速分析卡死点。
- 分析某些资源如 sem、mutex 的获取、 释放信息。
配置
Kernel Options ‑‑‑>
Backtrace Select (debug backtrace by machine code) ‑‑‑>
(X) debug backtrace by machine code // 通过解析机器码方式进行回溯
( ) debug backtrace by frame pointer // 通过解析frame pointer方式进行回溯
( ) no backtrace // 关闭栈回溯
接口介绍
int backtrace(char *taskname, void *output[], int size, int offset, print_function print_func);
参数:
- taskname : 任务名字;可为NULL,表示回溯当前任务
- output : 栈回溯结果保存数组,可以为NULL
- size : output数组大小,可为0
- offset : 栈回溯保存结果的偏移,可为0
- print_func : 打印函数,可用printf
返回值:
- level : 回溯层次
终端命令
在设备端的终端界面上支持使用 backtrace 命令对指定的任务进行回溯。
作用:查看指定任务堆栈回溯信息
用法:backtrace [taskname]
回溯信息解析
- 在 PC 端开发环境中,在 FreeRTOS SDK 根目录下,执行 source envsetup.sh
- 在 PC 端开发环境中,在 FreeRTOS SDK 的 lichee/rtos 目录下创建 backtrace.txt 文件,然后将回溯信息从终端中拷贝出来,并保存到 backtrace.txt 文件中。
- 在 PC 端开发环境中,执行 callstack backtrace.txt 命令,会获取以下回溯信息。
mhd_start_scan at /xxx/mhd_apps_scan.c:334 #mhd_start_scan表示函数名,/xxx/mhd_apps_scan.c表示函数所在的文件路径,334表示函数调用处的行号。
mhd_softap_start at /xxx/mhd_apps_softap.c:263
wifi_recv_cb at /xxx/mhd_api_test.c:624
mhd_get_host_sleep at /xxx/mhd_apps_wifi.c:81
bswap_16 at /xxx/aw‑alsa‑lib/bswap.h:39
(inlined by) convert_from_s16 at ??:?
linear_init at /xxx/pcm_rate_linear.c:378
resampler_basic_interpolate_single at /xxx/resample_speexdsp.c:395
__fill_vb2_buffer at /xxx/videobuf2‑v4l2.c:392
cci_read at /xxx/cci_helper.c:728
ecdsa_signature_to_asn1 at /xxx/ecdsa.c:294
cmd_wifi_fwlog at /xxx/mhd_api_test.c:449
# 函数调用顺序为从下到上,即cmd_wifi_fwlog ‑> ecdsa_signature_to_asn1 ‑> cci_read ... ‑> mhd_start_scan