天天看點

分享一款精小調試支援庫:dbuglib

嵌入式開發過程中,調試是必不可少的一個環節。怎樣調試才能快速定位代碼的問題呢?方法有很多,今天給大家分享一款精小調試支援庫:dbuglib.

概述

ulog日志記錄庫是一個精小的靜态日志記錄庫。内部很多功能均由宏定義來實作。使用者可以修改日志的級别用于過濾特定級别的日志。

檔案

  • ulog.h:定義了各種日志記錄級别和日志記錄宏
  • ulog.c:提供了記憶體列印等接口函數
  • ASSERT.h:提供了使用者可定義的斷言宏支援
  • VS檔案夾:VC上位機測試示例
  • MDK檔案夾:MDK下位機測試示例

嵌入式物聯網需要學的東西真的非常多,千萬不要學錯了路線和内容,導緻工資要不上去!

無償分享大家一個資料包,差不多150多G。裡面學習内容、面經、項目都比較新也比較全!某魚上買估計至少要好幾十。

點選這裡找小助理0元領取:加微信領取資料

分享一款精小調試支援庫:dbuglib

日志級别

ulog支援5種日志記錄級别,可在ulog.h檔案中修改LOG_CFG_LEVE宏定義來定義日志的記錄級别。

  • G_DEBUG:調試日志級别,用來記錄最詳細的調試資訊和執行步驟
  • G_TRACE:跟蹤日志級别,用來記錄重要的跟蹤資訊
  • G_WARNG:警告日志級别,用來記錄一些警告資訊
  • G_ERROR:錯誤日志級别,用來記錄嚴重的錯誤資訊
  • G_NONE:不做任何日志記錄
示例1:将LOG_CFG_LEVE配置為G_WARNG級别,則隻會顯示G_WAGNG和G_ERROR兩個級别的日志記錄,其他的記錄級别較低将不被顯示 示例2:配置為G_NONE級别将禁用日志記錄功能

定義日志記錄樣式

在ulog.h檔案中定義了LOG_FUN宏,使用者可以對其修改來改變日志的列印樣式

// 定義列印樣式
#define LOG_FUN(LEVESTR,format, ...)       \
    LOG_PRINTF("["LEVESTR"] <"__FILE__": %d"">: " format "\r\n",__LINE__,##__VA_ARGS__)           

使用方式

ASSERT_MSG(0, "test");
    uLOG(G_DEBUG,"error:%d",123);
    uLOG_MEM(G_DEBUG, randbuff, 125, "error:%d",586);           

列印資料如下:

[G_DEBUG] <main.c: 16>: error:123
[G_DEBUG] <main.c: 17>: error:586
00000000: 29 23 BE 84 E1 6C D6 AE 52 90 49 F1 F1 BB E9 EB  )#...l..R.I.....
00000010: B3 A6 DB 3C 87 0C 3E 99 24 5E 0D 1C 06 B7 47 DE  ...<..>.$^....G.
00000020: B3 12 4D C8 43 BB 8B A6 1F 03 5A 7D 09 38 25 1F  ..M.C.....Z}.8%.
00000030: 5D D4 CB FC 96 F5 45 3B 13 0D 89 0A 1C DB AE 32  ].....E;.......2
00000040: 20 9A 50 EE 40 78 36 FD 12 49 32 F6 9E 7D 49 DC   [email protected]..}I.
00000050: AD 4F 14 F2 44 40 66 D0 6B C4 30 B7 32 3B A1 22  [email protected];."
00000060: F6 22 91 9D E1 8B 1F DA B0 CA 99 02 B9 72 9D 49  ."...........r.I
00000070: 2C 80 7E C5 99 D5 E9 80 B2 EA C9 CC 53           ,.~.........S           

以上為程式的使用示例,說明如下:

  • uLOG:指定日志級别和相應的字元串,其支援printf類似的轉移修飾符
  • uLOG_MEM:可列印指定的記憶體資料,同樣需要指定日志級别,
  • ASSERT:該宏當參數為假時會停止程式,并列印顯示目前導緻斷言的檔案和行号
  • ASSERT_MSG:與ASSERT相同,隻不過多了個字元串參數,可以顯示一些資訊。

移植

該庫編寫時使用了一些C99特性,是以編譯器必須支援C99标準。已經在VS2015和MDK5.0中測試,均可正常工作。移植時必須定義LOG_PRINTF宏到實際的列印函數,還必須定義LOG_PUT_CHAR宏到實際的字元輸出函數:

// 字元輸出函數
#define LOG_PUT_CHAR(C) putchar(C)
// 日志記錄接口
#define LOG_PRINTF(format, ...) printf(format, ##__VA_ARGS__)           

開源位址:

https://gitee.com/git-lib/dbugLib-Prj

轉載自:zhangjinxing

文章來源于分享一款精小調試支援庫:dbuglib

原文連結:https://mp.weixin.qq.com/s/8t6XWGlvJJkhaL0CGRpnNA