這一部分由閱讀 《The Art of Debugging with
GDB,DDD,and Eclipse》整理,以知識點形式一條條列舉。本書講解很詳盡,是一本不錯的調試入門書籍。不過作為“the art”開頭的書,感覺內容分量不夠。
-------------調試基礎------------------
1、GDB:GNU Project Debugger,針對基於linux平台項目的調試器;DDD:Data Display Debbuger,資料顯示調試器,是GDB的一種GUI,內部以命令列方式與GDB互動,也提供直接的GDB命令列輸入視窗
2、根據二分搜尋方式,分段注釋原始碼,定位bug
3、GDB是針對機器語言指令的,而不是原始碼行,一行原始碼可能對應於數行機器語言。可以單步調試的GDB之所以可以使用原始碼行,是因為可執行檔中包含了額外的資訊。
4、監視點與斷點的區別:雖然都會在特定條件下暫停程式的執行,但斷點與原始碼中的位置關聯,而監視點與變數生命週期關聯。
5、(gdb) print display command call
6、程式崩潰:硬體會感知程式試圖在未經允許的情況下訪問一個記憶體單元,並執行對作業系統的跳轉(核心轉儲)
7、strace:跟蹤進程做過的所有系統調用,類似的有ltrace:跟蹤進程調用庫函數的情況
8、在真正複雜的網路調試情況中,可以使用開源Ethereal程式跟蹤單個TCP/IP分組
9、gdb coredump 調用流程:
$gdb exefile core
(gdb) backstrace
#0 0x400a925 in strcpy() from /lib/libc.so.6
#1 0x084084df in Init_string from ....
#2 0x084085e4 in main ....
10、調試期間,修改代碼不用退出GDB,節省啟動時間,保留斷點。
------------多活動內容相關的調試-------------------------
11、info threads : 給出關於當前所有線程的資訊,
thread 3:當前線程改成3;
break 88 thread 3:當線程3到達88行時暫停執行,
break 88 thread 3 if x == y:當線程3到達原始碼88行,並且變數x和y相等時停止執行
12、並行編程架構主要有兩種:共用記憶體和訊息傳遞。其中,多線程編程的底層實現就是共用記憶體。共用記憶體和訊息傳遞分別比較典型的實現是OpenMP和MPI包。
13、splint:動態檢查C語言程式安全弱點和編寫錯誤的工具,類似的針對C++的,cppcheck
14、valgrind:一款基於linux,用於記憶體調試、記憶體流失檢測以及效能分析的軟體開發工具
15、gcj:將java原始碼編譯為本地機器代碼,因此可以用GDB調試,也就可以用條件斷點了,比JDB更強大,而且不用新學一種調試器,運行速度也更快。
16、swig:simplified wrapper and interface generator:將C/C++編寫的軟體封裝編譯,與其它各種進階程式設計語言(特別是指令碼語言)進行嵌入聯結的開發工具。