除錯方式(完善的除錯方式和監控管理)
一、監控管理(監控行程)
1、記憶體檢測
每個10秒檢測記憶體,若可用記憶體小于15%,進行釋放系統快取,提高記憶體的利用率,并記錄日志,
利用sysinfo獲取記憶體大小,或者free命令獲取
struct sysinfo s_info;
sysinfo(&s_info);
系統快取釋放
nret = system("sync;sync");//先同步,防止資料丟失
nret = system("echo 3 > /proc/sys/vm/drop_caches");
nret = system("echo 1 > /proc/sys/vm/overcommit_memory");
nret = system("free");
2、CPU檢測
每10分鐘檢測一次CPU狀態,發現連續3次超過80%,記錄日志
CPU的計算公式
首先從/proc/stat中獲取 t1時刻系統總體的user、nice、system、idle、iowait、irq、softirq的值,得到此時Total CPU time since boot(記為total1)和 Total CPU idle time since boot(記為idle1),
其次,從/proc/stat中獲取t2時刻系統總的Total CPU time since boot(記為total2)和Total CPU idle time since boot(記為idle2),(方法同上一步)
最后,計算t2與t1之間系統總的CPU使用情況,也就是:
CPU percentage between t1 and t2 = ((total2-total1)-(idle2-idle1))/(total2-total1)* 100%
3、檢測指定執行緒是否存在
ps -T|grep thread_name|grep -v grep|grep app$|wc -l
thread_name為指定執行緒的名字,結果為在app行程內計算執行緒thread_name的個數,為1,則代表存在,反之,不存在,
4、執行緒卡死狀態監測
行程或者執行緒切換分為自愿切換(Voluntary)和強制切換(Involuntary),如果他們切換的次數不變,說明行程或者執行緒已經卡住,以此來檢測執行緒是否卡死狀態,
pid為行程的pid,以下命令可以列印出該行程的所有執行緒名稱、執行緒的pid、自愿切換的次數、強制切換的次數,
for file in /proc/pid/task/* ;do oneline=`grep -w -E 'Name|Pid|voluntary_ctxt_switches|nonvoluntary_ctxt_switches' $file/status` ;echo $oneline|awk '{print $2,$4,$6,$8}';done
另外,如果一個行程的自愿切換占多數,意味著它對CPU資源的需求不高,如果一個行程的強制切換占多數,意味著對它來說CPU資源可能是個瓶頸,這里需要排除行程頻繁呼叫sched_yield()導致強制切換的情況,
5、業務相關的檢測
例如IPC業務,可以檢測vi中斷 和 venc 幀率是否正常
二、完善的除錯方式
1、背景描述
一個完整專案或多或少會出現一些bug,而且有些bug是隱式的,有些是低概率性的,不好被發現,所以預防的措施就顯得很重要,程式中常見的bug有概率性程式崩潰或段錯誤、程式出現死鎖、記憶體泄露、檔案句柄泄露等,
(1)概率性程式崩潰或段錯誤的排查
coredump定位
backtrace堆疊回溯
交叉堆疊回溯
GDB工具除錯
以上介紹了四種處理段錯誤的方法,其中gdb工具是最好的段錯誤除錯工具,列印資訊齊全,但只適合于除錯階段,不適合于發布階段,堆疊回溯backtrace適用于除錯和發布階段,但列印資訊比gdb差,無法列印行號,在記憶體和flash特別小的時候也不適用,交叉堆疊回溯與堆疊回溯backtrace基本一樣,比堆疊回溯backtrace好在可以適用于flash和記憶體比較小的程式,當同樣也不能列印行號,
(2)記憶體泄露、檔案句柄泄露的預防
在開發中,經常會使用malloc,free分配釋放堆記憶體,使用open、close或者fopen、fclose來打開、關閉檔案,使用socket、close創建、關閉套接字等
當這些使用不配對時,就會導致記憶體泄漏的問題,進而可能會導致設備例外重啟或死機現象,
這里可通過二次封裝的方法來來預防記憶體泄漏,以malloc、free為例,主要表現是分別記錄不同地方呼叫malloc、free的次數,來判斷malloc、free是否配對使用,如果不配對使用,可以幫助定位到哪個地方是不配對使用的,以此達到記憶體泄漏定位的效果,
記憶體泄露、檔案句柄泄露的預防
(3)程式出現死鎖排查
行程或者執行緒出現死鎖,就會卡住,前面介紹到,可通過執行緒卡死狀態監測,即可判斷哪個執行緒卡住,具體卡在哪,可通過在線除錯GDB的方法,切換到對應執行緒,如果然后列印堆疊資訊,即可定位執行緒卡死的位置,
GDB工具除錯
三、除錯資訊的規范管理
除錯資訊一般有兩種,一種是可控,一種是不可控,不可控的除錯資訊一般用于除錯階段,像printf,直接列印,可控除錯資訊,一般用于維護階段,通過一個開關去控制資訊是否需要列印,避免所有除錯資訊全部列印,造成查看不變,關健資訊難帥選的麻煩,
1、除錯資訊的列印使用要方便且詳細
printf的封裝可以加上對應的檔案名、函式名,行號,方便除錯定位,
#define DH(fmt, args...)
printf("%s-%s-%d:" fmt, __FILE__,__FUNCTION__,__LINE__, ## args)
2、按模塊劃分并控制列印資訊,各個模塊除錯資訊不影響
除錯資訊的控制有兩種方式,一是總控制,總控制控制所有模塊的資訊的列印,另一種是模塊控制,每個模塊都有自己的除錯資訊的控制開關,
3、重要的除錯資訊需要存在保存到磁盤中,像重啟日志,錯誤日志,提醒日志等,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/223783.html
標籤:其他
上一篇:Consul添加配置詳解
