在linux下開發難免會遇到bug,但是由於沒有圖形IDE,導致debug也變得困難,其實只要掌握一些常用的debug工具,一些錯誤就能很快解決,本文就介紹一些常用的工具用以調試:
log
輸出log永遠是最簡單快捷的調試方式,可以快速定位bug,通過設置日志級別控制日志的輸出詳略程度,結合一些文本分析工具awk/sed/grep可以快速在大量日志中找到錯誤信息。
strace
是一個用來跟蹤系統調用的簡易工具。它最簡單的用途就是跟蹤一個程序整個生命周期里所有的系統調用,並把調用參數和返回值以文本的方式輸出。Strace還可以跟蹤發給進程的信號。支持attach正在運行的進程 strace -p <pid>, 當多線程環境下,需要跟蹤某個線程的系統調用,可以先ps -efL|grep <Process Name> 查找出該進程下的線程,然后調用starace –p <pid>進行分析。
pstack
用來跟蹤進程棧,比如我們發現一個服務一直處於work狀態(如假死狀態,好似死循環),使用這個命令就能輕松定位問題所在;可以在一段時間內,多執行幾次pstack,若發現代碼棧總是停在同一個位置,那個位置就需要重點關注,很可能就是出問題的地方;
gdb
經典的調試工具,功能很強大,注意此時編譯的時候應該使用-g選項,並用-Og進行優化。多線程下可以attach到進程來調試。
core dump文件
在進程收到某些信號而終止運行時,將此時進程地址空間的內容以及有關進程狀態的其他信息寫到core文件中,例如我們平時的非法訪問內存產生segment fault錯誤,利用gdb可以查看到到底是哪里發生了異常。有時候可以人為的向進程發送信號kill -11 <pid>,查看此時系統運行的狀態,例如多線程下程序突然停住了,此時就可能發生了死鎖,可以人為的產生信號,再來分析core dump。
valgrind
包含很多工具:
Memcheck。這是valgrind應用最廣泛的工具,一個重量級的內存檢查器,能夠發現開發中絕大多數內存錯誤使用情況,比如:使用未初始化的內存,使用已經釋放了的內存,內存訪問越界等。這也是本文將重點介紹的部分。
Callgrind。它主要用來檢查程序中函數調用過程中出現的問題。
Cachegrind。它主要用來檢查程序中緩存使用出現的問題。
Helgrind。它主要用來檢查多線程程序中出現的競爭問題。
Massif。它主要用來檢查程序中堆棧使用中出現的問題。
Extension。可以利用core提供的功能,自己編寫特定的內存調試工具。
默認使用的就是memcheck工具,在c++中指針的使用,一不留神就會產生異常,就可以利用memcheck進行檢查。個人一般用--track-origins=yes來定位未初始化變量的位置。
tcpdump
抓包用的,在開發網絡應用的時候很給力,結合awk/sed/grep可以快速查找網絡數據包。
stackoverflow
這個網站是個程序設計領域的問答網站,基本碰到的問題都能在這里面找到答案! 技術氛圍很強,從中能學到很多東西。