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

    文章

    1030

    浏览量

    47578
  • 上位机
    +关注

    关注

    27

    文章

    942

    浏览量

    54812
  • linxu
    +关注

    关注

    0

    文章

    7

    浏览量

    2558

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

文章出处:【微信号:麦克泰威廉希尔官方网站 ,微信公众号:麦克泰威廉希尔官方网站 】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

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

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

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

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

    梳理嵌入式Linux的一些知识

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

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

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

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

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

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

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

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

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

    PCB布板一些简易常用规则

    PCB布板一些简易常用规则   这几天还是关注一些简单入门的东西吧,主要介绍一些PCB中一些建议
    发表于 11-21 14:34 6632次阅读

    解析嵌入式开发中的一些硬件相关概念

    嵌入式系统开发,经常要接触硬件。做嵌入式开发对数字电路和模拟电路要有定的了解。这样才能深入的研究下去。下面我们简单的介绍嵌入式开发中的一些
    发表于 06-06 16:35 934次阅读
    解析<b class='flag-5'>嵌入式</b>开发中的<b class='flag-5'>一些</b>硬件相关概念

    嵌入式系统安全将面临的一些挑战

    当我们试图在较小的嵌入式系统中使用更多的功能时,它们的安全性常常被忽略。本文讨论了过去的一些安全漏洞,并讨论了嵌入式安全被忽略的原因。物联网可以看作是个极好的机会,以
    发表于 10-23 15:19 741次阅读

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

    本文主要介绍嵌入式系统的一些基础知识,希望对各位有帮助。
    的头像 发表于 02-18 10:44 2405次阅读

    嵌入式中的一些概念

    嵌入式中的一些概念嵌入式系统的概念什么是MCU、CPU、MPU、DSPMCUMPUDSP几大MCU公司瑞萨电子(Renesas)恩智浦(NXP)+飞思卡尔(Freescale)(后者被前者收购)微芯
    发表于 10-19 18:33 8次下载
    <b class='flag-5'>嵌入式</b>中的<b class='flag-5'>一些</b>概念

    有关嵌入式系统的一些思考

    有关嵌入式系统的一些思考何为嵌入式?为何要嵌入式?难点在哪里?发展趋势是什么?何为嵌入式?根据英国电气工程师协会( U.K. Institu
    发表于 10-19 18:33 2次下载
    有关<b class='flag-5'>嵌入式</b>系统的<b class='flag-5'>一些</b>思考

    一些封装中没有串口,或者串口已经被用作其他用途,要如何输出log

    一些封装中没有串口,或者串口已经被用作其他用途,要如何输出log? 在一些封装中,例如在裸机程序或者嵌入式系统中,因为种种原因,可能不存在串口可以用于输出
    的头像 发表于 10-31 14:37 521次阅读

    列举一些嵌入式Linux应用开发里经常使用的技巧和套路

    本篇文章,我们基于ELF 1S这款开发板,来列举一些嵌入式Linux应用开发里面,经常使用到的开发技巧和套路。
    的头像 发表于 11-14 10:44 479次阅读
    列举<b class='flag-5'>一些</b><b class='flag-5'>嵌入式</b>Linux应用开发里经常使用的技巧和套路