Re: [請益] 埋log debug

作者: fridayjason (I'm not Beloved)   2016-05-05 22:32:23
※ 引述《yshihyu (yshihyu)》之銘言:
: 我最近在 debug 把主要函數關鍵地方埋log, bug 有好幾個
: 發現有個有問題假設稱為 A bug 埋log找原因,
: 後來感覺函數關鍵log 跟 debug log 太多, 越來越亂很難分析
: 如果先mark掉函數關鍵地方的log 但是log很多地方感覺很麻煩,
: 解掉問題又在umark在繼續找 B bug之類的,
: 後來我作法是用gdb 只埋函數關鍵 log , 發現問題就用gdb 去看
: 但使用gdb 有時候沒辦法 log 可以分析整體 ,
: 因為有時候 log 不斷迭代幾次後才能看出前後數據找出問題點
: 大家用埋 log 有什麼技巧或是特殊工具方法嘛?
: 謝謝
分享一下個人經驗拋磚引玉
套件: 其實不用自己重寫 開源套件很多 看平台跟語言搜尋一下 如log4net log4cpp等
功能: log module本身要穩且不能影響正常功能 例如不能吃太多記憶體 IO頻寬 運算效能
尤其注意multi-thread時的IO和queue 若time-stamp不準至少相對順序要是正確的
要自己實作的話可以用 singleton pattern + producer-consumer pattern
輸出的部分建議要能支援直接顯示或者寫到檔案 這樣正式發行後方便跟客戶要紀錄
分層: 一般套件都會分幾個層次 建議自己有個準則方便篩選 以Android logcat而例:
Assert: 違反規格假設 例如不該是null的物件 或者數值超出假設範圍的情況等
Error: 內外系統錯誤 例如封包錯誤 資料庫錯誤 記憶體錯誤 底層套件崩潰等
Warning:邏輯流程警示 例如操作逾時 找不到檔案 輸入無效 連線中斷等
Info: 重要過程指標 例如檢查碼驗算值 資料總數 執行結果 判斷分歧點等
Debug: 巨觀函數除錯 例如"func(input1, input2) @ status = result"
Verbose:底層函數除錯 例如"func.step3 @ (var1, var2) = temp"
正式發行時應該只要開到Info層就夠了 再往下主要是開發時除錯在用
release build時可用define等方法把低層級的log關掉以提升效能
因此要注意寫在log裡的內容千萬不能影響正常程式執行 例如對變數做運算等
以上 請不吝指教~
作者: CaptainH (Cannon)   2016-05-05 23:34:00
Good
作者: happierway (杰夫)   2016-05-06 03:11:00
推推
作者: roger00 (Stage Column(?))   2016-05-06 19:06:00
挺清楚的
作者: zerofinal (人生~)   2016-05-11 13:08:00
推~

Links booklink

Contact Us: admin [ a t ] ucptt.com