最常用的調試工具是gdb,在此就不多說了,家庭常備。下面主要介紹一些其他的工具,滿足一些特殊需要的。
(對於一些工具只是簡單介紹功能,如果感興趣或覺得有用可以查閱相關資料)
ctags:
作用:
爲程序中所有函數建立索引,就像書籍總的目錄一樣。在當前目錄創建tags,
文件中每行由函數名,聲明該函數的文件和一個可以在文件中查找該函數定義的正則表達式。
cxref:(很有用)
作用:
分析c語言源程序並生成一個交叉引用表。它顯示每個符號(變量,#define,函數)都在程序中哪些地方使用過。
它生成一個經過排序的列表,每個符號的定義位置用星號(*)座標記,。
事例:
cxref *.c *.h
cflow
作用:
打印出一個函數調用庫。
prog/gprof:(極其有用)
作用:
當我們試着追蹤一個程序的性能問題時一個十分有用的技術就是執行性能測試 (execution profiling)。
通常被特殊的編譯器選項以及輔助程序所支持,一個程序的性能顯示他在哪裏花費時間。
使用:
先要在編譯的時候加上-pg選項 (-pg(gprof) -p(prof) )
cc -pg -o myapp myapp.c
運行myapp會生成一個gmon.out文件
這時可以用gprof分析myapp,會在終端顯示信息
gprof myapp
爲了方便閱讀,可以這樣使用gprof -b myapp gmon.out | less
選項:
-b 不再輸出統計圖表中每個字段的詳細描述。
-p 只輸出函數的調用圖(Call graph的那部分信息)。
-q 只輸出函數的時間消耗列表。
-e Name 不再輸出函數Name 及其子函數的調用圖(除非它們有未被限制的其它父函數)。可以給定多個 -e 標誌。
一個 -e 標誌只能指定一個函數。
-E Name 不再輸出函數Name 及其子函數的調用圖,此標誌類似於 -e 標誌,但它在總時間和百分比時間的計算中
排除了由函數Name 及其子函數所用的時間。
-f Name 輸出函數Name 及其子函數的調用圖。可以指定多個 -f 標誌。一個 -f 標誌只能指定一個函數。
-F Name 輸出函數Name 及其子函數的調用圖,它類似於 -f 標誌,但它在總時間和百分比時間計算中僅使用所打印的例程的時
間。可以指定多個 -F 標誌。一個 -F 標誌只能指定一個函數。-F 標誌覆蓋 -E 標誌。
-z 顯示使用次數爲零的例程(按照調用計數和累積時間計算)
使用注意:
1)一般gprof只能查看用戶函數信息。如果想查看庫函數的信息,需要在編譯是再加入“-lc_p”編譯參數代替“-lc”編譯參數,這樣程序
會鏈接libc_p.a庫,纔可以產生庫函數的profiling信息。
2) gprof只能在程序正常結束退出之後才能生成程序測評報告,原因是gprof通過在atexit()裏註冊了一個函數來產生結果信息,任何
非正常退出都不會執行atexit()的動作,所以不會產生gmon.out文件。如果你的程序是一個不會退出的服務程序,那就只有修改代碼來
達到目的。如果不想改變程序的運行方式,可以添加一個信號處理函數解決問題(這樣對代碼修改最少),例如:
static void sighandler( int sig_no )
{
exit(0);
}
signal( SIGUSR1, sighandler );
當使用kill -USR1 pid 後,程序退出,生成gmon.out文件。
鏈接資料:
http://www.ibm.com/developerworks/cn/linux/l-gnuprof.html
http://hujw0710.blog.163.com/blog/static/8797282200952324755785/
ElectricFence:
作用:
它嘗試用linux的虛擬內存機制來保護malloc和free所使用的內存,當它發現內存被破壞時就停止程序的使用。
使用:
編譯時要加上-efence選項
gcc myapp.c -o myapp -efence
然後運行程序,如果出現錯誤就會得到提示,運行gdb會得到更多信息(加上-g)