我們在除錯程式的時候,經常會需要知道在執行時某些變數的狀態(值),我們可以通過定義除錯開關,來生成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...