Linux 應用程式除錯技術/附錄
外觀
如果呼叫被訊號中斷,許多 API 函式會返回錯誤程式碼。通常這本身不是錯誤,應該重新啟動呼叫。例如
int raccept( int s, struct sockaddr *addr, socklen_t *addrlen )
{
int rc;
do {
rc = accept( s, addr, addrlen );
} while ( rc == -1 && errno == EINTR );
return rc;
}
可中斷函式列表在類 Unix 平臺之間有所不同。對於 Linux,請參閱 signal(7)。請注意sem_wait()& co. 在列表中。
即使條件尚未滿足,等待 pthreads 條件變數的執行緒也可能被喚醒。喚醒後,應顯式檢查條件,如果條件不滿足,則返回等待。
- 功能影響
- 哪些模組受到影響;哪些功能受到影響。
- 更改的程式碼使用哪些模組和功能。
- 哪些模組/功能正在使用它。
- 副作用。
- 架構
- 可擴充套件性
- 穩定性
- 功能
- 魯棒性
- 技術細節
- 通用
- 第一遍:邏輯。正確性。它(試圖)做什麼。
- 副作用。
- 為什麼程式碼在那裡?
- 第二遍:錯誤處理和奇異情況。
- 副作用。
- 是否檢查了返回值。程式碼能否處理它們。
- 引數
- 是否處理邊界/越界/奇怪的值。
- 引數型別:方便?
- 資料來自哪裡?上游三個層級。
- 輸出將去哪裡?下游三個層級。
- 可能的/允許的輸出是什麼?是否所有輸出在下游都已處理?
- 變數:是否初始化?
- (過/下)溢位
- 緩衝區。
- 整數型別。
- 斷言的不變性和假設。
- 迴圈:是否少一?是否無限?
- 遞迴:是否存在基本情況?
- 第三遍:執行緒安全性。
- 本地化?
- 重複資訊?
- 數學
- 是否先處理較小的值?
- NaN 檢查/std::isnan 及其朋友。
- 被零除。
- 第一遍:邏輯。正確性。它(試圖)做什麼。
- C
- return:資源處理。
- 使用 N 函式(例如 s'n'printf vs. sprintf)。
- printf 及其朋友:格式化程式是否與型別和引數數量匹配?
- 不可重入/非執行緒安全的 API
- 不安全/存在競爭條件的 API (mktemp())
- 列舉
- 是否處理了所有情況?
- 預設返回/日誌/丟擲錯誤
- 未指定/未定義/實現定義/非標準行為或擴充套件
- C++
- 第四遍:異常處理
- 在解構函式中。
- 異常捕獲邊界?
- 資源是否受到 RAII 保護。
- 第五遍:效能。
- C++11:完美轉發和臨時物件。
- 它如何擴充套件?
- 初始化的資料成員。
- 六大要素(預設建構函式、解構函式、複製/移動建構函式/運算子)。
- 虛解構函式?
- 資源處理:RAII。
- 建立和銷燬的位置在哪裡?生命週期管理?
- 徹底的 const 和 volatile。
- 謂詞是否無狀態。
- 對 std::string 位置使用 size_t。
- 為什麼要進行強制轉換?
- 不要在鎖下進行跟蹤
- 不要在鎖下銷燬物件
- 第四遍:異常處理
- 通用
- 平臺特定
- POSIX/SUS
- 中斷呼叫。
- 虛假喚醒。
- 已知存在競爭條件的呼叫。
- POSIX/SUS
一個偽檔案系統,公開有關正在執行的程序的資訊
# tree /proc/26041
/proc/26041
...
|-- cmdline # Command line
|-- cwd -> /current/working/folder/for/PID
|-- environ # Program environment variables
|-- exe -> /bin/su
|-- fd # Open files descriptors
| |-- 0 -> /dev/pts/21
| |-- 1 -> /dev/pts/21
| |-- 2 -> /dev/pts/21
| `-- 3 -> socket:[113497835]
|-- fdinfo
| |-- 0
| |-- 1
| |-- 2
| `-- 3
|-- latency
|-- limits
|-- maps
|-- mem
|-- mountinfo
|-- mounts
|-- mountstats
...
# cat /proc/26041/status
...
VmPeak: 103276 kB # Max virtual memory reached
VmSize: 103196 kB # Current VM
VmLck: 0 kB
VmHWM: 1492 kB
VmRSS: 1488 kB # Live memory used
...
Threads: 1
...
給定可執行檔案中的地址或可重定位物件的某個部分中的偏移量,addr2line將其轉換為檔名和行號。
一個用於反解符號名稱的工具。
- 反彙編二進位制檔案,包括原始碼objdump -C -S -r -R -l <binary>