本文将深入剖析 Rockchip SDK 中
minilogger
的设计理念与实现机制,探讨其模块级调试能力、异常追踪能力、静态与动态控制手段,并提供工程级的移植与优化建议。
Rockchip 的 minilogger
并非传统意义上的通用日志库,而是为满足嵌入式系统低资源占用、高可控性、可动态开关调试信息的需求而生:
+------------------+
| main.cpp | --> 示例调用、初始化接口
+------------------+
|
v
+------------------+ +---------------------+
| log.cpp | <-----> | backtrace.cpp |
| 日志输出实现层 | | 异常追踪与信号钩子注册 |
+------------------+ +---------------------+
|
v
syslog(), fprintf(), signal(), backtrace() ...
log
宏到 syslog 输出void vlog(int priority, const char *fmt, va_list ap) {
if (log_flag & LOG_TO_SYSLOG) {
vsyslog(priority, fmt, ap);
}
if (log_flag & LOG_TO_STDERR) {
vfprintf(stderr, fmt, ap);
}
}
输出级别定义:
#define LOG_INFO 6
#define LOG_WARN 4
#define LOG_ERROR 3
#define LOG_DEBUG 7
struct minilog_debug_desc {
const char *file;
int flags;
};
#define DBG(fmt, ...) do { static struct minilog_debug_desc __attribute__((section("__debug"))) desc = { __FILE__, 0 }; if (desc.flags & DEBUG_FLAG_PRINT) minilog_debug(fmt, ##__VA_ARGS__); } while (0)
extern struct minilog_debug_desc __start___debug;
extern struct minilog_debug_desc __stop___debug;
void minilog_debug_enable(const char *file) {
for (p = &__start___debug; p < &__stop___debug; ++p) {
if (strstr(p->file, file)) {
p->flags |= DEBUG_FLAG_PRINT;
}
}
}
void show_backtrace() {
void *stack[64];
int depth = backtrace(stack, 64);
char **symbols = backtrace_symbols(stack, depth);
for (int i = 0; i < depth; i++) {
minilog_error("Backtrace: %s\n", symbols[i]);
}
free(symbols);
}
signal(SIGSEGV, signal_handler);
signal(SIGABRT, signal_handler);
void signal_handler(int sig) {
minilog_error("Caught signal %d\n", sig);
show_backtrace();
exit(EXIT_FAILURE);
}
glib
用于字符串、哈希表libunwind
提供更精确符号解析(可选)execinfo.h
提供 backtrace()
,但需 GNU glibc 支持backtrace.cpp
+--------------------+
| main() 函数入口 |
+---------+----------+
|
v
+-------------------------+
| __minilog_log_init() |
| 初始化日志系统、信号处理 |
+---------+---------------+
|
v
+-----------------------------+
| 日志调试信息匹配 g_pattern |
| __minilog_log_enable() |
+-------------+---------------+
|
v
+-------------------------+
| 执行业务函数(foo1, foo2)|
+-------------+-----------+
|
v
+-------------------------+
| minilog_info() 等宏调用 |
| -> vsyslog/syslog 输出 |
+-------------+-----------+
|
v
+-------------------------+
| 日志输出至: |
| - 串口 console |
| - /var/log/syslog 文件 |
+-------------------------+
异常时:
+----------------------------+
| 信号处理 signal_handler() |
| -> show_backtrace() |
| -> minilog_error() |
+----------------------------+
特性 | minilogger | log4c | spdlog | glog |
---|---|---|---|---|
占用内存 | 极低 | 中等 | 中等 | 高 |
支持 syslog | ✅ | ✅ | ❌ | ✅ |
异常 backtrace | ✅ | ❌ | ❌ | ✅ |
编译期调试控制 | ✅ | ❌ | ❌ | ❌ |
模块级 Debug 开关 | ✅ | ❌ | ✅ | ✅ |
容易移植 | ✅ | 一般 | 差 | 差 |
Rockchip 的 minilogger
是一个极其工程化且易裁剪移植的日志系统,特别适用于嵌入式项目、Bootloader 环境或资源受限的 Linux 系统。
建议: