0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

汇总一些嵌入式打log的一些规则

麦克泰技术 来源:嵌入式大杂烩 2024-01-19 11:07 次阅读

在我们嵌入式开发中,打印日志是最常用的一种调试手段。合理地打印日志,可以帮助我们快速地分析问题。

本篇文章我们来汇总一些嵌入式打log的一些规则。

1、什么操作下加日志?

(1)错误处理

对于不能恢复的严重错误,日志内容应详细到足以帮助定位问题,但同时不应该包含敏感信息。比如申请内存失败时使用错误(Error)级别加上日志信息。

(2)一些关键性的操作

一些很关键地处理,无论是正常情况或者异常情况都要打印日志。比如wifi打开时要有对应的日志信息。

(3)系统的打开、关闭

记录系统启动和关闭过程中的关键步骤有助于分析系统初始化是否正确,或者系统是否正常关闭。

(4)性能监控

日志可以记录系统运行的关键性能指标,如CPU和内存使用率、IO操作等,以便进行系统性能分析和优化。

(5)关键数据

一些关键数据需要打印,很多功能上的问题大多直接与数据进行挂钩。

(6)通信日志

对于需要与外部设备或网络通信嵌入式系统,记录通信日志可以帮助分析和调试通信协议或数据交换的问题。

(7)记录用户行为

在需要分析用户如何与嵌入式设备交互的情况下,记录用户行为的日志会非常有帮助。

(8)if、switch

分支判断中,各执行分支需要加上对应的日志信息,可以帮助我们准确地知道程序执行的走向。

(9)程序崩溃时的信息

比如,Linxu下应用进程崩溃时的调用堆栈信息。

#include
#include
#include
#include

voidfunc0(void)
{
printf("Thisisfunc0
");
int*p=NULL;
*p=1234;
}

voidfunc1(void)
{
printf("Thisisfunc1
");
func0();
}

voidfunc2(void)
{
printf("Thisisfunc2
");
func1();
}

voiddump(intsigno)
{
void*array[100];
size_tsize;
char**strings;

size=backtrace(array,100);
strings=backtrace_symbols(array,size);

printf("Obtained%zdstacks.
",size);
for(inti=0;i< size; i++)
    {
        printf("%s
", strings[i]);
    }
        
    free(strings);
    exit(0);
}

int main(int argc, char **argv)
{
    printf("==================segmentation fault test5==================
");
    signal(SIGSEGV, &dump);
    func2();

    return 0;
}
c4f0db78-b677-11ee-8b88-92fbcf53809c.png

2、功能模块标签

项目中肯定会划分有多个模块,可以给各个模块标记一个模块标签字符串,包含在日志条目里。这样我们就可以在日志文件里通过模块标签来筛选某个模块的日志,提高我们定位问题的效率。

比如:

//app_wifi.c

#defineLOG_TAG"[wifi_module]"
#defineLOG_D(fmt,arg...)LOG_D_TAG(LOG_TAG,fmt,##arg)
LOG_D("hellowifimodule");

输出:

[wifi_module]hellowifimodule

3、模块日志开关

设置模块日志开关,可以方便我们调试、分析问题时,缩小分析范围。当我们的函数设计有多个功能函数模块的时候,当某个模块出现问题时,这个时候我们只是关心此模块,那么可以先把其他模块的日志功能关闭掉,只是打开关心模块的日志。

如:

//module1.c
#include"module1.h"

#ifMODULE1_LOG_SWITCH
#defineLOG_MODULE1(fmt,args...)DBG_PRINTF(fmt,##args)
#else
#defineLOG_MODULE1(fmt,args...)
#endif

//module2.c
#include"module2.h"

#ifMODULE2_LOG_SWITCH
#defineLOG_MODULE2(fmt,args...)DBG_PRINTF(fmt,##args)
#else
#defineLOG_MODULE2(fmt,args...)
#endif

//config.h
#defineMODULE1_LOG_SWITCH0
#defineMODULE2_LOG_SWITCH1

4、时间戳

日志应包含时间戳,可以方便地查看某段代码的执行时间、确定问题发生的具体时间。时间戳最好能精确到微秒/毫秒。

5、日志级别

使用不同的日志级别可以帮助筛选和控制输出的信息量。

常见的日志级别包括:

错误(Error):程序无法运行或严重问题。

警告(Warning):可能的问题,程序可以继续运行。

信息(Info):程序运行状态信息。

调试(Debug):详细的调试信息,包括变量值和程序流程。

详细(Verbose):非常详细的信息,用于深入调试。

6、格式统一

为了使日志易于阅读,所有日志应保持一致的格式。

日志里常包含的固定信息有:

文件名

行号

时间日期/时间戳

函数名

模块名称

进程ID

线程ID

可根据需要进行组合。如:

[2024-01-1411:12:30.666][wifi_module][func:wifi_init]

7、过滤控制

使用日志动态过滤控制功能可以动态地调整日志地输出,但前提是项目使用地日志组件具备这样的能力。比如EasyLogger(https://github.com/armink/EasyLogger)。

c5022d74-b677-11ee-8b88-92fbcf53809c.png

8、Release/Debug开关

由于日志打印可能占用不少系统资源,应当注意其对性能的影响。在Release版本中,可能需要减少日志输出或者去掉一些不必要的日志,需要一个开关来进行切换。

9、封装日志接口

嵌入式中,日志的输出大多数情况下会输出到串口终端。但也有一些场景,需要把日志输出到屏幕、网络设备、定制化的上位机等场景。需要留出对应接口,方便灵活切换。






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式开发
    +关注

    关注

    18

    文章

    979

    浏览量

    46961
  • 上位机
    +关注

    关注

    26

    文章

    861

    浏览量

    54049
  • linxu
    +关注

    关注

    0

    文章

    7

    浏览量

    2507

原文标题:嵌入式中,日志调试法的一些规则!

文章出处:【微信号:麦克泰技术,微信公众号:麦克泰技术】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    关于嵌入式培训的一些看法

    我们不能忙的为了工作去学习嵌入式,重要的是要自己喜欢。现在嵌入式很火,一些大学的学生开始往这个方向发展。但是面对层出不穷的培训学校以及各种课程体系的攻击。学生们顿时陷入了迷茫之中。各家的培训机构都
    发表于 02-02 15:08

    新手求教:推荐一些嵌入式的入门视频

    如题,希望各位大侠推荐一些入门的嵌入式视频,最好是打基础的,真心求教
    发表于 05-18 20:23

    求教嵌入式和ARM的一些问题。

    搞定了51单片机,学校的其他专业课程又没什么兴趣,嵌入式系统下学期才有课,本来想深入学习一些别的单片机比如AVR什么的,但是后来想想还是想学嵌入式先。本人对编程还是很有信心的,但是嵌入式
    发表于 11-08 21:20

    本人嵌入式培训时参考的一些软件资料

    本帖最后由 eehome 于 2013-1-5 09:51 编辑 本人嵌入式培训看的一些软件资料,希望给大家点帮助。。。如果有什么疑问可以给我留言
    发表于 12-01 21:35

    学习嵌入式一些心得!

    了,再学习就感到容易理解。实际上,众多嵌入式应用,并不定需要操作系统。也可以根据实际项目需要再学习。定不要被一些嵌入式实时操作系统移植培
    发表于 02-02 09:35

    对于嵌入式一些认识

    本来学嵌入式就不简单,所以大家都会去找一些学习嵌入式的方法或步骤什么的,如果是你去学嵌入式的话,肯定也不会例外,下面可以起来了解下
    发表于 05-25 17:40

    学习嵌入式linux上的一些问题分享

    不知不觉,博客似乎也成为了自己记录学习道路上的一些迷茫的个小日记。可能也是自己疫情期间在家呆了4个月的时间,也可能是最近课程压力比较大,或者是最近和导师聊了下之后的想法,还有最近自己学习嵌入式
    发表于 11-04 06:50

    梳理嵌入式Linux的一些知识

    前言这篇文章简单我们来起梳理嵌入式Linux的一些知识,方便于一些想跟我样想要由单片机进阶到嵌入式
    发表于 11-04 07:33

    大佬都在看的嵌入式Linux的一些知识

    前言 这篇文章简单我们来起梳理嵌入式Linux的一些知识,方便于一些想跟我样想要由单片机进阶到嵌入式
    发表于 11-05 08:12

    分享一些嵌入式方面的基础知识

    同时更关键的是为了补齐一些嵌入式方面的基础知识,做如下笔记,持续记录:1.嵌入式系统基础知识(1) 嵌入式系统组成嵌入式系统是:以应用为中心
    发表于 11-08 07:41

    介绍嵌入式系统的一些基础知识

    本文主要介绍嵌入式系统的一些基础知识,希望对各位有帮助。嵌入式系统基础1、嵌入式系统的定义(1)定义:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、
    发表于 12-21 07:32

    嵌入式一些日常小技巧分享

    杂记–算法学习日志+关于实验室部门架构的思考+嵌入式一些日常小技巧分享算法学习日志因为从初中到现在直是学习嵌入式程序的开发和研究,并没有在面向对象的程序上有很大的研究和进展,在近期发
    发表于 12-21 08:07

    嵌入式系统的一些学习建议分享

    有些学员在学嵌入式的时候,直在边缘打转,本来嵌入式就是有难度的,如果你再没有基础的话,那么学习起来就真的费劲了,还好下面小编准备了嵌入式系统的一些
    发表于 12-22 08:10

    嵌入式开发的一些知识点汇总

    这个专栏我们讲下嵌入式开发的一些知识,首先给大家讲下单片机常见的类外设,总线,希望不太清楚的朋友看了文章对嵌入式开发,用到的总线有个了解。目录如下1.UART2. IIC3. SPI
    发表于 12-24 06:40

    起梳理嵌入式Linux的一些知识

    前言这篇文章简单我们来起梳理嵌入式Linux的一些知识,方便于一些想跟我样想要由单片机进阶到嵌入式
    发表于 01-05 07:18