linux下debug工具,linuxdebug工具
在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
這個網站是個程式設計領域的問答網站,基本碰到的問題都能在這裡面找到答案! 技術氛圍很強,從中能學到很多東西。