0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

匯總一些嵌入式打log的一些規(guī)則

麥克泰技術(shù) ? 來源:嵌入式大雜燴 ? 2024-01-19 11:07 ? 次閱讀

在我們嵌入式開發(fā)中,打印日志是最常用的一種調(diào)試手段。合理地打印日志,可以幫助我們快速地分析問題。

本篇文章我們來匯總一些嵌入式打log的一些規(guī)則。

1、什么操作下加日志?

(1)錯(cuò)誤處理

對(duì)于不能恢復(fù)的嚴(yán)重錯(cuò)誤,日志內(nèi)容應(yīng)詳細(xì)到足以幫助定位問題,但同時(shí)不應(yīng)該包含敏感信息。比如申請(qǐng)內(nèi)存失敗時(shí)使用錯(cuò)誤(Error)級(jí)別加上日志信息。

(2)一些關(guān)鍵性的操作

一些很關(guān)鍵地處理,無論是正常情況或者異常情況都要打印日志。比如wifi打開時(shí)要有對(duì)應(yīng)的日志信息。

(3)系統(tǒng)的打開、關(guān)閉

記錄系統(tǒng)啟動(dòng)和關(guān)閉過程中的關(guān)鍵步驟有助于分析系統(tǒng)初始化是否正確,或者系統(tǒng)是否正常關(guān)閉。

(4)性能監(jiān)控

日志可以記錄系統(tǒng)運(yùn)行的關(guān)鍵性能指標(biāo),如CPU和內(nèi)存使用率、IO操作等,以便進(jìn)行系統(tǒng)性能分析和優(yōu)化。

(5)關(guān)鍵數(shù)據(jù)

一些關(guān)鍵數(shù)據(jù)需要打印,很多功能上的問題大多直接與數(shù)據(jù)進(jìn)行掛鉤。

(6)通信日志

對(duì)于需要與外部設(shè)備或網(wǎng)絡(luò)通信嵌入式系統(tǒng),記錄通信日志可以幫助分析和調(diào)試通信協(xié)議或數(shù)據(jù)交換的問題。

(7)記錄用戶行為

在需要分析用戶如何與嵌入式設(shè)備交互的情況下,記錄用戶行為的日志會(huì)非常有幫助。

(8)if、switch

分支判斷中,各執(zhí)行分支需要加上對(duì)應(yīng)的日志信息,可以幫助我們準(zhǔn)確地知道程序執(zhí)行的走向。

(9)程序崩潰時(shí)的信息

比如,Linxu下應(yīng)用進(jìn)程崩潰時(shí)的調(diào)用堆棧信息。

#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
c4f0db78-b677-11ee-8b88-92fbcf53809c.png

2、功能模塊標(biāo)簽

項(xiàng)目中肯定會(huì)劃分有多個(gè)模塊,可以給各個(gè)模塊標(biāo)記一個(gè)模塊標(biāo)簽字符串,包含在日志條目里。這樣我們就可以在日志文件里通過模塊標(biāo)簽來篩選某個(gè)模塊的日志,提高我們定位問題的效率。

比如:

//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、模塊日志開關(guān)

設(shè)置模塊日志開關(guān),可以方便我們調(diào)試、分析問題時(shí),縮小分析范圍。當(dāng)我們的函數(shù)設(shè)計(jì)有多個(gè)功能函數(shù)模塊的時(shí)候,當(dāng)某個(gè)模塊出現(xiàn)問題時(shí),這個(gè)時(shí)候我們只是關(guān)心此模塊,那么可以先把其他模塊的日志功能關(guān)閉掉,只是打開關(guān)心模塊的日志。

如:

//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、時(shí)間戳

日志應(yīng)包含時(shí)間戳,可以方便地查看某段代碼的執(zhí)行時(shí)間、確定問題發(fā)生的具體時(shí)間。時(shí)間戳最好能精確到微秒/毫秒。

5、日志級(jí)別

使用不同的日志級(jí)別可以幫助篩選和控制輸出的信息量。

常見的日志級(jí)別包括:

錯(cuò)誤(Error):程序無法運(yùn)行或嚴(yán)重問題。

警告(Warning):可能的問題,程序可以繼續(xù)運(yùn)行。

信息(Info):程序運(yùn)行狀態(tài)信息。

調(diào)試(Debug):詳細(xì)的調(diào)試信息,包括變量值和程序流程。

詳細(xì)(Verbose):非常詳細(xì)的信息,用于深入調(diào)試。

6、格式統(tǒng)一

為了使日志易于閱讀,所有日志應(yīng)保持一致的格式。

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

文件名

行號(hào)

時(shí)間日期/時(shí)間戳

函數(shù)名

模塊名稱

進(jìn)程ID

線程ID

可根據(jù)需要進(jìn)行組合。如:

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

7、過濾控制

使用日志動(dòng)態(tài)過濾控制功能可以動(dòng)態(tài)地調(diào)整日志地輸出,但前提是項(xiàng)目使用地日志組件具備這樣的能力。比如EasyLogger(https://github.com/armink/EasyLogger)。

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

8、Release/Debug開關(guān)

由于日志打印可能占用不少系統(tǒng)資源,應(yīng)當(dāng)注意其對(duì)性能的影響。在Release版本中,可能需要減少日志輸出或者去掉一些不必要的日志,需要一個(gè)開關(guān)來進(jìn)行切換。

9、封裝日志接口

嵌入式中,日志的輸出大多數(shù)情況下會(huì)輸出到串口終端。但也有一些場景,需要把日志輸出到屏幕、網(wǎng)絡(luò)設(shè)備、定制化的上位機(jī)等場景。需要留出對(duì)應(yīng)接口,方便靈活切換。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式開發(fā)
    +關(guān)注

    關(guān)注

    18

    文章

    1006

    瀏覽量

    47352
  • 上位機(jī)
    +關(guān)注

    關(guān)注

    27

    文章

    927

    瀏覽量

    54551
  • linxu
    +關(guān)注

    關(guān)注

    0

    文章

    7

    瀏覽量

    2532

原文標(biāo)題:嵌入式中,日志調(diào)試法的一些規(guī)則!

文章出處:【微信號(hào):麥克泰技術(shù),微信公眾號(hào):麥克泰技術(shù)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    新手求教:推薦一些嵌入式的入門視頻

    如題,希望各位大俠推薦一些入門的嵌入式視頻,最好是打基礎(chǔ)的,真心求教
    發(fā)表于 05-18 20:23

    求教嵌入式和ARM的一些問題。

    搞定了51單片機(jī),學(xué)校的其他專業(yè)課程又沒什么興趣,嵌入式系統(tǒng)下學(xué)期才有課,本來想深入學(xué)習(xí)一些別的單片機(jī)比如AVR什么的,但是后來想想還是想學(xué)嵌入式先。本人對(duì)編程還是很有信心的,但是嵌入式
    發(fā)表于 11-08 21:20

    對(duì)于嵌入式一些認(rèn)識(shí)

    本來學(xué)嵌入式就不簡單,所以大家都會(huì)去找一些學(xué)習(xí)嵌入式的方法或步驟什么的,如果是你去學(xué)嵌入式的話,肯定也不會(huì)例外,下面可以起來了解下
    發(fā)表于 05-25 17:40

    梳理嵌入式Linux的一些知識(shí)

    前言這篇文章簡單我們來起梳理嵌入式Linux的一些知識(shí),方便于一些想跟我樣想要由單片機(jī)進(jìn)階到嵌入式
    發(fā)表于 11-04 07:33

    分享一些嵌入式方面的基礎(chǔ)知識(shí)

    同時(shí)更關(guān)鍵的是為了補(bǔ)齊一些嵌入式方面的基礎(chǔ)知識(shí),做如下筆記,持續(xù)記錄:1.嵌入式系統(tǒng)基礎(chǔ)知識(shí)(1) 嵌入式系統(tǒng)組成嵌入式系統(tǒng)是:以應(yīng)用為中心
    發(fā)表于 11-08 07:41

    介紹嵌入式系統(tǒng)的一些基礎(chǔ)知識(shí)

    本文主要介紹嵌入式系統(tǒng)的一些基礎(chǔ)知識(shí),希望對(duì)各位有幫助。嵌入式系統(tǒng)基礎(chǔ)1、嵌入式系統(tǒng)的定義(1)定義:以應(yīng)用為中心,以計(jì)算機(jī)技術(shù)為基礎(chǔ),軟硬件可裁剪,適應(yīng)應(yīng)用系統(tǒng)對(duì)功能、可靠性、成本、
    發(fā)表于 12-21 07:32

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

    雜記–算法學(xué)習(xí)日志+關(guān)于實(shí)驗(yàn)室部門架構(gòu)的思考+嵌入式一些日常小技巧分享算法學(xué)習(xí)日志因?yàn)閺某踔械浆F(xiàn)在直是學(xué)習(xí)嵌入式程序的開發(fā)和研究,并沒有在面向?qū)ο蟮某绦蛏嫌泻艽蟮难芯亢瓦M(jìn)展,在近期發(fā)
    發(fā)表于 12-21 08:07

    起梳理嵌入式Linux的一些知識(shí)

    前言這篇文章簡單我們來起梳理嵌入式Linux的一些知識(shí),方便于一些想跟我樣想要由單片機(jī)進(jìn)階到嵌入式
    發(fā)表于 01-05 07:18

    PCB布板一些簡易常用規(guī)則

    PCB布板一些簡易常用規(guī)則   這幾天還是關(guān)注一些簡單入門的東西吧,主要介紹一些PCB中一些建議
    發(fā)表于 11-21 14:34 ?6589次閱讀

    嵌入式系統(tǒng)安全將面臨的一些挑戰(zhàn)

    當(dāng)我們?cè)噲D在較小的嵌入式系統(tǒng)中使用更多的功能時(shí),它們的安全性常常被忽略。本文討論了過去的一些安全漏洞,并討論了嵌入式安全被忽略的原因。物聯(lián)網(wǎng)可以看作是個(gè)極好的機(jī)會(huì),以
    發(fā)表于 10-23 15:19 ?655次閱讀

    嵌入式系統(tǒng)的一些基礎(chǔ)知識(shí)

    本文主要介紹嵌入式系統(tǒng)的一些基礎(chǔ)知識(shí),希望對(duì)各位有幫助。
    的頭像 發(fā)表于 02-18 10:44 ?2179次閱讀

    嵌入式中的一些概念

    嵌入式中的一些概念嵌入式系統(tǒng)的概念什么是MCU、CPU、MPU、DSPMCUMPUDSP幾大MCU公司瑞薩電子(Renesas)恩智浦(NXP)+飛思卡爾(Freescale)(后者被前者收購)微芯
    發(fā)表于 10-19 18:33 ?8次下載
    <b class='flag-5'>嵌入式</b>中的<b class='flag-5'>一些</b>概念

    有關(guān)嵌入式系統(tǒng)的一些思考

    有關(guān)嵌入式系統(tǒng)的一些思考何為嵌入式?為何要嵌入式?難點(diǎn)在哪里?發(fā)展趨勢(shì)是什么?何為嵌入式?根據(jù)英國電氣工程師協(xié)會(huì)( U.K. Institu
    發(fā)表于 10-19 18:33 ?2次下載
    有關(guān)<b class='flag-5'>嵌入式</b>系統(tǒng)的<b class='flag-5'>一些</b>思考

    一些封裝中沒有串口,或者串口已經(jīng)被用作其他用途,要如何輸出log

    一些封裝中沒有串口,或者串口已經(jīng)被用作其他用途,要如何輸出log? 在一些封裝中,例如在裸機(jī)程序或者嵌入式系統(tǒng)中,因?yàn)榉N種原因,可能不存在串口可以用于輸出
    的頭像 發(fā)表于 10-31 14:37 ?408次閱讀

    列舉一些嵌入式Linux應(yīng)用開發(fā)里經(jīng)常使用的技巧和套路

    本篇文章,我們基于ELF 1S這款開發(fā)板,來列舉一些嵌入式Linux應(yīng)用開發(fā)里面,經(jīng)常使用到的開發(fā)技巧和套路。
    的頭像 發(fā)表于 11-14 10:44 ?393次閱讀
    列舉<b class='flag-5'>一些</b><b class='flag-5'>嵌入式</b>Linux應(yīng)用開發(fā)里經(jīng)常使用的技巧和套路