程式設計技巧之除錯日誌

2021-10-14 08:47:58 字數 1590 閱讀 4991

我們在除錯程式的時候,經常會需要知道在執行時某些變數的狀態(值),我們可以通過定義除錯開關,來生成debug除錯版本或者release最終發行版本程式,先看個簡單的例子:

void

main

(void

)else

/***注釋標記4***

省略一些函式執行

這些函式可能會影響runtime_flag的值

***************/

}

以上我們舉了乙個比較簡單的例子說明,在類似**中,我們如果需要知道某一變數執行時的狀態,比如想知道注釋標記3處的runtime_flag的值,我們該怎麼辦?

一般除錯,是通過編譯除錯軟體進入除錯debug模式下加斷點等方法。

但是,很多場景下,尤其是產品專案已落地測試維護的產品,我們是沒有辦法在現場通過除錯軟體進行原始碼分析,此時通過預先的巨集技巧,來實現除錯開關就顯得尤為關鍵。讓我們直接上原始碼:

/*巨集除錯開關*/

#define debug

/*顯示列印資訊所在的檔案、行數、函式名以及需要print的資訊*/

#define dbg_printf

(fmt, args...

) \

void

main

(void

)else

/***注釋標記4省略處***/

}

通過以上的巨集定義開關,我們就可以知道標記1以及標記3處我們需要知道的變數值在執行到所在檔案、行數、函式名、以及變數值是多少。在除錯階段我們可以巨集定義debug,測試無問題後,可將debug巨集定義注釋,直接生成release版本,後續如果需要debug,再巨集定義恢復,這就及其方便。

上述巨集定義技巧在切換為release版本時,還需要通過編譯軟體修改原始碼在進行操作,有沒有什麼方法可以在外部除錯的情況下,直接切換debug模式狀態或者release狀態?讓我們直接上原始碼:

/*顯示列印資訊所在的檔案、行數、函式名以及需要print的資訊*/

#define dbg_printf

(fmt, args...

) \

int debug =1;

// 全域性變數,預設開關為開啟狀態

void

main

(void

)else

/***注釋標記4省略處***/

}/*不同應用物件應用的中斷形式不同,我們以外部輸入觸發中斷舉例*/

void interrupt input_var()

通過以上的變數開關,可以實現動態執行測試時就可以切換是否輸出除錯日誌資訊。

關於中斷觸發,不同的應用平台使用的方式方法不一樣,統一抽象的思想是:

在流程動態執行中,輸入debug值,會觸發中斷(不同的形式叫法不一樣),這會改變debug值,從而實現動態的外部切換debug或release版本狀態,也就是是否輸出除錯時我們希望看到的除錯日誌資訊。

讓我們將兩個方法做個對比:

不同點:

iPhone開發技巧之除錯篇 儲存日誌

大部分人除錯程式都是看日誌吧,這裡我就給大家總結一下iphone程式中新增儲存日誌的方法。objective c開發程式的時候,有專門的日誌操作類nslog,它將指定的輸出到標準的錯誤輸出上 stderr 我們可以利用它在xcode的日誌輸出視窗,或者是輸出到具體的檔案當中。下面是我在程式中常用到的...

iPhone開發技巧之除錯篇(2) 儲存日誌

大部分人除錯程式都是看日誌吧,這裡我就給大家總結一下iphone程式中新增儲存日誌的方法。objective c開發程式的時候,有專門的日誌操作類nslog,它將指定的輸出到標準的錯誤輸出上 stderr 我們可以利用它在xcode的日誌輸出視窗,或者是輸出到具體的檔案當中。下面是我在程式中常用到的...

除錯技巧之 找準調試點

除錯的時候,你要找到除錯的點。比如你要抓乙個url,那麼你就在你的coustwebview loaurl的時候,去抓。到最後肯定要走到那裡的那個地方加個斷點,不管怎麼走,都會走到 的地方。除錯除了低階的按按鈕,高階的是知道在 加斷點。真的。為什麼我沒想到,我想到的竟然是在onlinefragment...