跳轉到內容

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 條件變數的執行緒也可能被喚醒。喚醒後,應顯式檢查條件,如果條件不滿足,則返回等待。


程式碼審查清單

[編輯 | 編輯原始碼]
  1. 功能影響
    1. 哪些模組受到影響;哪些功能受到影響。
    2. 更改的程式碼使用哪些模組和功能。
    3. 哪些模組/功能正在使用它。
    4. 副作用。
  2. 架構
    1. 可擴充套件性
    2. 穩定性
    3. 功能
    4. 魯棒性
  3. 技術細節
    1. 通用
      1. 第一遍:邏輯。正確性。它(試圖)做什麼。
        1. 副作用。
        2. 為什麼程式碼在那裡?
      2. 第二遍:錯誤處理和奇異情況。
        1. 副作用。
        2. 是否檢查了返回值。程式碼能否處理它們。
        3. 引數
          1. 是否處理邊界/越界/奇怪的值。
          2. 引數型別:方便?
          3. 資料來自哪裡?上游三個層級。
          4. 輸出將去哪裡?下游三個層級。
            1. 可能的/允許的輸出是什麼?是否所有輸出在下游都已處理?
        4. 變數:是否初始化?
        5. (過/下)溢位
          1. 緩衝區。
          2. 整數型別。
        6. 斷言的不變性和假設。
        7. 迴圈:是否少一?是否無限?
        8. 遞迴:是否存在基本情況?
      3. 第三遍:執行緒安全性。
      4. 本地化?
      5. 重複資訊?
      6. 數學
        1. 是否先處理較小的值?
        2. NaN 檢查/std::isnan 及其朋友。
        3. 被零除。
    2. C
      1. return:資源處理。
      2. 使用 N 函式(例如 s'n'printf vs. sprintf)。
      3. printf 及其朋友:格式化程式是否與型別和引數數量匹配?
      4. 不可重入/非執行緒安全的 API
      5. 不安全/存在競爭條件的 API (mktemp())
      6. 列舉
        1. 是否處理了所有情況?
        2. 預設返回/日誌/丟擲錯誤
      7. 未指定/未定義/實現定義/非標準行為或擴充套件
    3. C++
      1. 第四遍:異常處理
        1. 在解構函式中。
        2. 異常捕獲邊界?
        3. 資源是否受到 RAII 保護。
      2. 第五遍:效能。
        1. C++11:完美轉發和臨時物件。
        2. 它如何擴充套件?
      3. 初始化的資料成員。
      4. 六大要素(預設建構函式、解構函式、複製/移動建構函式/運算子)。
      5. 虛解構函式?
      6. 資源處理:RAII。
      7. 建立和銷燬的位置在哪裡?生命週期管理?
      8. 徹底的 const 和 volatile。
      9. 謂詞是否無狀態。
      10. 對 std::string 位置使用 size_t。
      11. 為什麼要進行強制轉換?
      12. 不要在鎖下進行跟蹤
      13. 不要在鎖下銷燬物件
  4. 平臺特定
    1. POSIX/SUS
      1. 中斷呼叫。
      2. 虛假喚醒。
      3. 已知存在競爭條件的呼叫。


一個偽檔案系統,公開有關正在執行的程序的資訊

# 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
...
參考文獻
[編輯 | 編輯原始碼]
sysstat, sar
[編輯 | 編輯原始碼]


其他工具

[編輯 | 編輯原始碼]
addr2line
[編輯 | 編輯原始碼]

給定可執行檔案中的地址或可重定位物件的某個部分中的偏移量,addr2line將其轉換為檔名和行號。

一個用於反解符號名稱的工具。

  • 反彙編二進位制檔案,包括原始碼objdump -C -S -r -R -l <binary>
  • HLE:硬體鎖省略
  • HT:超執行緒
  • RTM:受限事務記憶體
  • TSX: 英特爾事務同步擴充套件([1][2]
華夏公益教科書