1 動態(tài)分析技術
對于動態(tài)分析技術的解釋如下:
在程序運行的時候能夠加入檢測例程净刮,對執(zhí)行情況進行監(jiān)控,并提示出錯的地方。
動態(tài)分析技術會更容易檢查出實際運行時出現的問題岭佳。
動態(tài)分析技術有以下特點:
動態(tài)分析工具不需要重新鏈接運行庫或者是修改代碼,使用起來很方便萧锉。
動態(tài)分析技術會讓程序執(zhí)行變得更慢珊随。
動態(tài)分析技術發(fā)現的問題不太可能是誤報!
動態(tài)監(jiān)測工具能夠為程序檢測提供哪些方面的幫助柿隙,比如:
1叶洞、未經初始化的變量
2、泄漏的內存
3禀崖、訪問非可用的地址空間
常見的有Valgrind衩辟,JavaScript的Jalangi,SystemTap波附,perf等等
2 Valgrind
常見的動態(tài)跟蹤工具套件之一艺晴,能夠提供內存管理、線程bug方面的檢查掸屡。使用Valgrind之前最好重新對C++程序使用-g命令編譯封寞,提供豐富的調試信息。
命令格式如下
valgrind [valgrind選項] 所檢測的程序[程序選項]
2.1 Valgrind選項
--tool ? <組件> 所使用的檢測組建仅财,比如memcheck(實際上是默認的不需要加)狈究、cachegrind、massif等組件
-v ? ? ? ? 即verbose更為詳細的模式
-q ? ? ? ? 過濾其他告警只打印錯誤
--trace-children=<yes> ?在多進程的情況下盏求,檢查由exec創(chuàng)建的子進程
--leak-check=<yes> ? 是否對內存泄漏進行檢查
?--time-unit=B ? 調整輸出的時間單元
......
2.2 Valgrind組件
- memcheck ? 內存檢查工具抖锥,可檢查的常用問題見2.3。
- cachegrind ? 提供程序使用緩存的情況风喇。cg_annotate對采樣進行更為細致的展示宁改。
- callgrind ? ? ? 提供函數之間的調用關系圖。使用callgrind_annotate對采樣進行分析魂莫。使用callgrind_control可以和正在運行的程序交互还蹲,獲得當前運行時的情況。
- helgrind ? ? ? ?線程同步錯誤的檢查工具。檢查非合理使用的POSIX線程模型(比如銷毀上了鎖的同步量谜喊、回收仍存在已上鎖同步量的內存等等問題)潭兽、由加鎖順序導致的死鎖問題、數據競爭斗遏。
- drd ? ? ? ? ? ? ? ?線程錯誤檢測工具山卦。支持POSIX線程編程模型。
多線程常常出現的問題有5大類:
1诵次、數據競爭(Data Races)即沒有使用鎖來保證線程并發(fā)訪問的安全账蓉。
2、鎖競爭(Lock Contention)即一個線程持有鎖的時間過長
3逾一、死鎖(Deadlock)即簡單模型下一個線程持鎖A铸本,要鎖B,而別的線程持鎖B遵堵,要鎖A箱玷。
4、偽共享(fasle sharing)即多個處理器上的線程陌宿,訪問同一塊cache變量锡足,導致CPU的局部緩存總是要保持一致。由CPU的緩存一致性引起壳坪。
5舶得、沒有合理使用POSIX線程模型
- massif ? ? ?堆分析工具。目的是幫助分析堆弥虐、額外分配的內存(對齊使用)的使用情況扩灯,幫助程序減少內存的使用。并能給出程序每一部分對應內存的分配情況霜瘪。配合ms_print分析輸出情況。
2.3 內存檢查常見告警
使用非法地址
Invalid write of size X
Address XXX is 0 bytes after a block of size Y alloc'd
未初始化的空間
Uninitialized value was created by a heap allocation
內存泄漏
XX bytes in Y blocks are definitely lost in loss record...
使用未初始化的變量
Conditional jump or move depends on uninitialised value(s)
非法釋放內存(比如對一個指針多次調用free或者delete)
Invalid free()
不合理的分配和釋放(new匹配delete惧磺,new [] 匹配 delete [], malloc系列匹配free颖对,在Linux平臺可能不是個問題)
Mismatched free() / delete / delete []
另外,進行?--leak-check檢查時還可以得到四種情況磨隘。
definitely lost ?內容完全丟失缤底,指向該塊的指針都找不到
indirectly lost ? 不直接丟失,不是塊丟失番捂,而是指向鏈上的某個環(huán)節(jié)丟失
possibly lost ? 內容可能丟失个唧,指向鏈完整,但至少有一個地址可能是恰好指到鏈上的內部指針
still reachable ?可正常訪問
參考資料
valgrind用戶手冊:http://valgrind.org/docs/manual/manual.html