目录
引言
在调试星闪WS63开发板的程序使,使用Mbed TLS(mbedtls-3.1)时,握手失败、证书校验错误、内存泄漏 等异常往往没有任何提示,只能干瞪眼。
官方在 library/debug.c
里已经预留了一套完整的调试钩子,只要“拧松”两个开关就能让内部细节像流水账一样吐出来。
三步开启调试
在编译阶段把调试代码编进去
修改open_source\mbedtls\mbedtls_v3.1.0\harden\build\conncet\mbedtls.cmake文件,在其中加上MBEDTLS_DEBUG_C宏。
设置“日志过滤级别”
需要再程序中设置过滤级别,数字越大日志越详细:
级别 | 内容 |
---|---|
0 | 静默,完全不出(默认) |
1 | 错误 |
2 | 状态改变 |
3 | 基本信息 |
4 | 更多细节 |
下面是示例:
#include "mbedtls/debug.h"
mbedtls_debug_set_threshold(4);
注册打印回调
mbedtls_ssl_conf_dbg
是 Mbed TLS 用来注册“SSL/TLS 调试日志回调函数”的唯一接口。
一句话概括:只要想让 mbedtls/debug.c
里的调试语句真正“落地”到串口/文件/日志系统,就必须在配置阶段调用它。
void mbedtls_ssl_conf_dbg(mbedtls_ssl_config *conf,
void (*f_dbg)(void *, int, const char *, int, const char *),
void *p_dbg);
参数 | 含义 |
---|---|
conf | 指向已初始化的 mbedtls_ssl_config 结构体。 |
f_dbg | 应用层自己写的调试回调函数;若为 NULL 则关闭日志。 |
p_dbg | 透传到回调的第一个形参 ctx ,在星闪SDK中填写NULL即可。 |
static void my_debug(void *ctx, /* = p_dbg */
int level, /* 调试级别 0-4 */
const char *file,/* 源文件路径 */
int line, /* 行号 */
const char *str) /* 日志内容 */
{
/* 这里可以自由发挥:打印时间戳、过滤级别、输出到 RTT/UART 等 */
(void)ctx;
printf("[TLS:%d] %s:%04d: %s", level, file, line, str);
}
后续正常 mbedtls_ssl_setup
即可;所有握手、证书、加解密细节都会走到 my_debug
。
常见“踩坑”提醒
症状 | 原因 | 解决 |
---|---|---|
编译后毫无日志 | 没开 MBEDTLS_DEBUG_C | 检查宏定义 |
只有 library/debug.c 里几行 | debug_threshold 太低 | mbedtls_debug_set_threshold(4) |
日志太多刷屏 | 级别太高 | 降到 2 或 3 |
结束语
调试信息一开,Mbed TLS 就不再是黑盒。
如果本文帮到了你,欢迎点个赞、收个藏,评论区一起交流踩过的坑!