1. 程式人生 > >【Linux】【Debug】一個簡單的debug資訊輸出方法

【Linux】【Debug】一個簡單的debug資訊輸出方法

一個簡單debug資訊輸出方法

在軟體開發時,經常要在程式碼關鍵地方新增必要除錯資訊跟蹤程式碼執行分支或者引數值,為了除錯和軟體釋出方便,除錯程式碼往往要求做到:
1)在debug時生效,而在釋出時為了控制編譯產物的大小,往往需要去掉debug程式碼;
2)可用通過引數控制debug資訊的輸出等級(型別);
下面通過一個例子,介紹如何在程式碼中新增debug資訊的方法。
首先,先在公共的標頭檔案中定義一個巨集,比如:

#ifdef DBG
#define DBG_PRINT(Level, Fmt)           \
{                                       \
    if
(Level <= DebugLevel) \ { \ printf Fmt; \ } \ } #else /* no debug information */ #define DBG_PRINT(Level, Fmt) #endif

可以看到,這個巨集通過條件編譯#ifdef DBG … #else … #endif控制;另外,巨集通過引數level,對列印內容進行控制;
然後,在外部的Makefile中,通過Makefile引數CFLAGS 進行控制

EXEC = helloworld
OBJS = helloworld.o

\# If you want to debug app, add following line
CFLAGS += -DDBG
CFLAGS += -I./

all: $(EXEC)

$(EXEC): $(OBJS)
    $(CC) $(CFLAGS) $(LDFLAGS) -o [email protected] $(OBJS) $(LDLIBS)

romfs:
    $(ROMFSINST) /sbin/$(EXEC)

install:
    cp -f $(EXEC) $(INSTALL_DIR
)/bin clean: rm -f core *~ *.o helloworld*.d

OK,這個debug介面就可以使用了,呼叫這個介面函式的app中,app的程式碼中可以增加引數-d,如下:

while(argc > 0)
if (...)
{
...
}
else if (strncmp(argv[0], "-d", 2) == 0)
        {
            { argc--; argv++; }
            DebugLevel= atoi(argv[0]);
        }

然後在命令呼叫時通過引數-d控制除錯資訊的型別(等級),比如:
#helloworld -d 2
一般的除錯資訊等級可以分為:

\#define DEBUG_OFF                  0
\#define DEBUG_ERROR                1
\#define DEBUG_WARN                 2
\#define DEBUG_TRACE                3
\#define DEBUG_INFO                 4

Linux kernel中提供8種列印資訊,設計錯誤資訊型別時可以參考,

#define KERN_EMERG      "<0>"    /* system is unusable */   
#define KERN_ALERT      "<1>"    /* action must be taken immediately */   
#define KERN_CRIT       "<2>"    /* critical conditions */   
#define KERN_ERR        "<3>"    /* error conditions */   
#define KERN_WARNING    "<4>"    /* warning conditions */   
#define KERN_NOTICE     "<5>"    /* normal but significant */   
#define KERN_INFO       "<6>"    /* informational */   
#define KERN_DEBUG      "<7>"    /* debug-level messages */  
#define KERN_EMERG      "<0>"    /* system is unusable */
#define KERN_ALERT      "<1>"    /* action must be taken immediately */
#define KERN_CRIT       "<2>"    /* critical conditions */
#define KERN_ERR        "<3>"    /* error conditions */
#define KERN_WARNING    "<4>"    /* warning conditions */
#define KERN_NOTICE     "<5>"    /* normal but significant */
#define KERN_INFO       "<6>"    /* informational */
#define KERN_DEBUG      "<7>"    /* debug-level messages */

另外,對於一些系統呼叫函式失敗,錯誤碼記錄在errno中,使用該變數需要包含標頭檔案errno.h,然後通過函式介面:

char *strerror(int errnum);

返回該錯誤碼對應的字元資訊。比如,socket程式設計中使用bind繫結伺服器IP和埠,返回出錯,程式碼:

DBG_PRINT(DEBUG_ERROR, ("bind rcv tcp failed, msg = %s!\n", strerror(errno)));

輸出結果:

bind rcv tcp failed, msg = Address already in use!

相關推薦

LinuxDebug一個簡單debug資訊輸出方法

一個簡單debug資訊輸出方法 在軟體開發時,經常要在程式碼關鍵地方新增必要除錯資訊跟蹤程式碼執行分支或者引數值,為了除錯和軟體釋出方便,除錯程式碼往往要求做到: 1)在debug時生效,而在釋出時為了控制編譯產物的大小,往往需要去掉debug程式碼; 2

Django01_創建一個簡單的項目

版本 啟動服務 star nag png size inline 管理 round 1.創建Django項目點擊:file-->new project,出現下面的對話框。選擇Django欄目,輸入項目名稱,選擇python解釋器版本,點擊create創建。Django

使用webmagic搭建一個簡單的爬蟲

class 直接 了解 pid 個數 粘貼 body 教程 相關配置 【轉】使用webmagic搭建一個簡單的爬蟲 剛剛接觸爬蟲,聽說webmagic很不錯,於是就了解了一下。 webmagic的是一個無須配置、便於二次開發的爬蟲框架,它提供簡單靈活的API,只需少量代碼

人工智慧用Python實現一個簡單的人臉識別,原來我和這個明星如此相似

近幾年來,興起了一股人工智慧熱潮,讓人們見到了AI的能力和強大,比如影象識別,語音識別,機器翻譯,無人駕駛等等。總體來說,AI的門檻還是比較高,不僅要學會使用框架實現,更重要的是,需要有一定的數學基礎,如線性代數,矩陣,微積分等。 幸慶的是,國內外許多大神都已經給我們造好“輪子”,我們可以直接來使用某些模型

人工智能用Python實現一個簡單的人臉識別,原來我和這個明星如此相似

數值 但是 智能 深度學習 lib python 數學 三方 python實現 近幾年來,興起了一股人工智能熱潮,讓人們見到了AI的能力和強大,比如圖像識別,語音識別,機器翻譯,無人駕駛等等。總體來說,AI的門檻還是比較高,不僅要學會使用框架實現,更重要的是,需要有一定的數

很有趣用Python實現一個簡單的人臉識別,原來我和這個明星如此相似

近幾年來,興起了一股人工智慧熱潮,讓人們見到了AI的能力和強大,比如影象識別,語音識別,機器翻譯,無人駕駛等等。總體來說,AI的門檻還是比較高,不僅要學會使用框架實現,更重要的是,需要有一定的數學基礎,如線性代數,矩陣,微積分等。 幸慶的是,國內外許多大神都已經給我們造好“輪子”,我們可

Java利器之Intellij Idea建立一個簡單的java專案

1、當我們安裝好Intellij之後我們開啟是這樣的一個介面: 2、然後我們點選File->new project 3、我們在上面點選java然後是要設定project SDK,這個是我們在安裝jdk的路徑比如:D:\JAVA\jdk1.7.0

個人學習筆記Java Web用一個簡單的jsp頁面實現輸出100以內的素數

<%@ page language="java" import="java.util.*" contentType="text/html;charset=utf-8" pageEncoding="utf-8"%> <html> <

20171013opencv安裝和一個簡單例項

轉載自http://blog.csdn.net/poem_qianmo/article/details/19809337 原博主@淺墨_毛星雲 (跪,感謝大佬分享經驗,解決菜鳥入門難題!) 博主是一名準研究生,研究生階段準備學習計算機視覺方向,涉及影象識別和處理,選

java基礎-socket通訊的一個簡單例子

在java語言中,Socket可以分為兩種型別:面向連線的Socket通訊協議(TCP),和麵向無連線的Socket通訊協議(UDP).任何一個Socket都是由IP地址和埠號唯一確定的。 Socket的生命週期可以分為3個階段,開啟Socket、使用Socket收發資料和

Android 網路資料解析實現一個簡單的新聞例項(一)

      一般安卓在學到非同步任務AsyncTask之後都會有個安卓小專案的任務。得到(荔枝新聞,茶百科等)新聞網路介面來解析網路圖片或文字到ListView元件上顯示。其中要使用到的知識大概有:獲取網路資料(HttpUtil),解析網路資料(NewsParse),防止因

IOS利用ASIHTTPRequest 實現一個簡單的登陸驗證

【原創作品, 歡迎轉載,轉載請在明顯處註明! 謝謝。 今天給大家帶來一個簡單的登陸驗證,用的是ASIHttpRequest 這個開源類庫,使用的方法很簡單,從網上下載下來以後,新增到專案中,並新增一下這些框架。 下面上程式碼 // // ViewControll

蟲師--系列JMeter基礎之一 一個簡單的效能測試

來自:http://www.cnblogs.com/fnng/archive/2012/12/22/2829479.html     作者:蟲師 上一節中,我們瞭解了jmeter的一此主要元件,那麼這些元件如何使用到效能測試中呢。這一節建立一個簡單的測試計劃來使用這些元

龍書筆記用Python實現一個簡單數學表示式從中綴到字尾語法的翻譯器(採用遞迴下降分析法)

上篇筆記介紹了語法分析相關的一些基礎概念,本篇筆記根據龍書第2.5節的內容實現一個針對簡單表示式的字尾式語法翻譯器Demo。 備註:原書中的demo是java例項,我給出的將是邏輯一致的Python版本的實現。在簡單字尾翻譯器程式碼實現之前,還需要介紹幾個基本概念。1. 自

編譯原理龍書筆記(二)一個簡單的語法制導翻譯器(仍未完成)

這篇部落格是根據自己學習龍書,因為博主習慣了英語環境,在強行從英語轉化為中文的時候難免會有些不自然,請大家諒解。 感謝沉魚姐姐,很多答案都是參考了她的github,雖然無緣認識,但也算是一位領路人。 正文: 一個簡單的語法制導翻譯器 在本章中

小白學PyTorch15 TF2實現一個簡單的服裝分類任務

【新聞】:機器學習煉丹術的粉絲的人工智慧交流群已經建立,目前有目標檢測、醫學影象、時間序列等多個目標為技術學習的分群和水群嘮嗑的總群,歡迎大家加煉丹兄為好友,加入煉丹協會。微信:cyx645016617. 參考目錄: [TOC] ## 0 為什麼學TF 之前的15節課的pytorch的學習,應該是讓不少朋

Linux探索之旅第一部分第三課:測試並安裝Ubuntu

u盤 nco 過程 sans ubunt windows u盤啟動盤 系統 .com 內容簡單介紹 1、第一部分第三課:測試並安裝Ubuntu 2、第一部分第四課預告:磁盤分區 測試並安裝Ubuntu 大家好,經過前兩個比較偏理論(是否

Linux數據庫Redis安裝配置

con debug top size 日誌 stream oca mono onf 一,Redis配置 1、下載安裝 $ wget http://download.redis.io/releases/redis-2.8.17.tar.gz $ tar xzf re

Linux探索之旅第四部分第三課:文件傳輸,瀟灑同步

命令行 上傳文件 文件夾 images lsh wget命令 ace 目標 wechat 內容簡單介紹 1、第四部分第三課:文件傳輸。瀟灑同步 2、第四部分第四課:分析網絡。隔離防火 文件傳輸。瀟灑同步 這一課的內容相

3、Linux系統編程系統目錄詳解

升級 user ssa pci edi 靜態 描述 com 沒有 Linux系統目錄詳解 一、Linux系統目錄結構 1、根目錄/   這就是根目錄。對你的電腦來說,有且只有一個根目錄。所有的東西,我是說所有的東西都是從這裏開始。舉個例子:當你在終端裏輸入“/home”,