軟體工程/工具/偵錯程式簡介
偵錯程式或除錯工具是一種用於測試和除錯其他程式(“目標”程式)的計算機程式。要檢查的程式碼也可能在指令集模擬器(ISS)上執行,這種技術在其在遇到特定條件時停止的能力方面具有強大的功能,但通常比直接在適當的(或相同的)處理器上執行程式碼速度慢一些。 一些偵錯程式提供兩種操作模式 - 全模擬或部分模擬,以限制這種影響。
當程式由於程式設計錯誤而無法正常繼續時,就會發生“崩潰”。例如,程式可能嘗試使用當前版本的 CPU 上不可用的指令,或嘗試訪問不可用或受保護的記憶體。當程式“崩潰”或達到預設條件時,偵錯程式通常會顯示原始程式碼中的位置,如果它是原始碼級偵錯程式或符號偵錯程式,現在通常在整合開發環境中看到。 如果它是低階偵錯程式或機器語言偵錯程式,它將顯示反彙編中的行(除非它還具有線上訪問原始原始碼的能力,並且可以顯示來自彙編或編譯的程式碼的相應部分)。
通常,偵錯程式還提供更復雜的功能,例如逐行執行程式(單步執行或程式動畫),透過斷點在某個事件或指定指令處停止(中斷)(暫停程式以檢查當前狀態),並跟蹤某些變數的值。 一些偵錯程式能夠在程式執行時修改程式的狀態,而不僅僅是觀察它。 也許還可以繼續在程式中的不同位置執行以繞過崩潰或邏輯錯誤。
一個好的偵錯程式的重要性不可言喻。實際上,對於給定的語言和平臺,這種工具的存在和質量往往是決定其使用的因素,即使另一種語言/平臺更適合該任務。 [需要引用]。 有人說,在習慣了使用偵錯程式後,沒有偵錯程式會“讓你感覺像一個在黑暗的房間裡尋找一隻不存在的黑貓的盲人”。[1] 然而,由於偵錯程式必然會對軟體程式的內部計時產生影響,因此軟體在偵錯程式下執行的方式(通常確實如此)與正常執行的方式不同。因此,即使使用了一個好的除錯工具,也很難追蹤複雜的多執行緒或分散式系統中的執行時問題。
使偵錯程式對消除錯誤有用的相同功能使其可以作為軟體破解工具來逃避複製保護、數字版權管理和其他軟體保護功能。它通常也使其用作通用測試驗證工具測試覆蓋率和效能分析器,尤其是在顯示指令路徑長度的情況下。
大多數當前的主流除錯引擎,如 gdb 和 dbx,都提供基於控制檯的命令列介面。偵錯程式前端是對偵錯程式引擎的流行擴充套件,它提供了 IDE 整合、程式動畫和視覺化功能。 一些早期的大型機偵錯程式,如 IBM OLIVER(CICS 互動式測試/除錯)和 SIMON(批處理互動式測試/除錯),早在 1970 年代就為 IBM System/360 及更高版本的作業系統提供了相同的功能。
一些偵錯程式針對單一特定語言執行,而另一些則可以透明地處理多種語言。例如,如果主要目標程式是用 COBOL 編寫的,但呼叫了彙編子例程以及 PL/1 子例程,則偵錯程式可以動態切換模式以適應語言的更改。
一些偵錯程式還包含記憶體保護以避免儲存衝突,例如緩衝區溢位。這在事務處理環境中可能非常重要,在事務處理環境中,記憶體是從任務到任務的基礎上從記憶體“池”中動態分配的。
大多數現代微處理器在其 CPU 設計中至少具有以下一項功能,以使除錯更容易
- 對程式進行單步執行的硬體支援,例如陷阱標誌。
- 滿足 Popek 和 Goldberg 虛擬化要求的指令集使編寫在與正在除錯的軟體相同的 CPU 上執行的偵錯程式軟體變得更容易;這樣的 CPU 可以全速執行被測程式的內部迴圈,並且仍然在偵錯程式的控制之下。
- 系統內程式設計允許外部硬體偵錯程式重新程式設計被測系統(例如,新增或刪除指令斷點)。許多具有此類 ISP 支援的系統也具有其他硬體除錯支援。
- 對程式碼和資料斷點的硬體支援,例如地址比較器和資料值比較器,或者在需要更多工作的情況下,頁面錯誤硬體。
- 對硬體除錯介面的 JTAG 訪問,例如 ARM 架構處理器上的那些介面,或使用 Nexus 命令集。嵌入式系統中使用的處理器通常具有廣泛的 JTAG 除錯支援。
- 只有 6 個引腳的微控制器需要使用 JTAG 的低引腳數替代品,例如 Atmel AVR 上的 BDM、Spy-Bi-Wire 或 DebugWire。例如,DebugWire 在 RESET 引腳上使用雙向訊號。

- AppPuncher 偵錯程式 - 用於除錯富網際網路應用程式
- AQtime
- CA/EZTEST - 是一個 CICS 互動式測試/除錯軟體包
- CharmDebug - Charm++ 的偵錯程式
- CodeView
- DBG - 一個 PHP 偵錯程式和分析器
- dbx
- DDD(資料顯示偵錯程式)
- 分散式除錯工具(Allinea DDT)
- DDTLite - 適用於 Visual Studio 2008 的 Allinea DDTLite
- DEBUG - DOS 和 Microsoft Windows 的內建偵錯程式
- MySQL 偵錯程式
- Opera Dragonfly
- 動態除錯技術 (DDT) 及其八進位制對應物八進位制除錯技術
- Eclipse
- 適用於 Eclipse 的嵌入式系統除錯外掛
- FusionDebug
- gDEBugger OpenGL、OpenGL ES 和 OpenCL 偵錯程式和分析器。 適用於 Windows、Linux、Mac OS X 和 iPhone
- GNU 偵錯程式 (GDB)、GNU Binutils
- 英特爾偵錯程式 (IDB)
- Insight
- Parasoft Insure++
- iSYSTEM - 嵌入式系統的線上偵錯程式
- 互動式反彙編器 (IDA Pro)
- Java 平臺偵錯程式體系結構
- Jinx - 用於 heisenbugs 的全系統偵錯程式。 它作為裝置驅動程式透明地工作。
- JSwat - 開源 Java 偵錯程式
- LLDB
- MacsBug
- Nemiver - GNOME 桌面環境的圖形 C/C++ 偵錯程式
- OLIVER(CICS 互動式測試/除錯) - 一個配備 GUI 的指令集模擬器(ISS)
- OllyDbg
- FlexTracer - SQL 語句的共享軟體偵錯程式
- Omniscient Debugger - 用於 Java 的前向和後向偵錯程式
- pydbg
- IBM Rational Purify
- RealView Debugger - ARM 為其生產和設計的商業偵錯程式
- sdb
- SIMMON(模擬監視器)
- SIMON(批處理互動式測試/除錯)—— 一款用於批處理的配備了 GUI 的指令集模擬器
- SoftICE
- TimeMachine——由 Green Hills Software 設計的向前和向後偵錯程式
- TotalView
- TRACE32——用於嵌入式系統的線上偵錯程式
- Turbo Debugger
- Ups——C、Fortran 原始碼級偵錯程式
- Valgrind
- VB Watch Debugger——Visual Basic 6.0 的偵錯程式
- Microsoft Visual Studio 偵錯程式
- WinDbg
- WonderLeak - 高效能 Windows 堆和控制代碼分配分析器。
- Xdebug——PHP 偵錯程式和分析器
一些功能最強大和最流行的偵錯程式只實現了簡單的命令列介面 (CLI),這通常是為了最大程度地提高可移植性和最小化資源消耗。雖然透過圖形使用者介面 (GUI) 進行除錯可以被認為更容易、更高效。這就是 GUI 偵錯程式前端的原因,它允許使用者透過圖形使用者介面監控和控制從屬的僅 CLI 偵錯程式。一些 GUI 偵錯程式前端設計為相容各種僅 CLI 偵錯程式,而另一些則針對一個特定的偵錯程式。
- 許多整合開發環境都帶有整合偵錯程式(或標準偵錯程式的前端)。
- 許多 Eclipse 透檢視,例如 Java 開發工具 (JDT) [1],提供了一個偵錯程式前端。
- DDD 是 GNU 專案的標準前端。它是一個複雜的工具,可以與大多數常見的偵錯程式(GDB、jdb、Python 偵錯程式、Perl 偵錯程式、Tcl 等)原生或透過一些外部程式(用於 PHP)一起使用。
- GDB(GNU 偵錯程式)GUI
- Emacs——Emacs 編輯器內建了對 GNU 偵錯程式的支援,充當前端。
- KDbg——KDE 開發工具的一部分。
- Nemiver——一個 GDB 前端,可以很好地整合到 GNOME 桌面環境中。
- xxgdb——GDB 和 dbx 偵錯程式的 X 視窗前端。
- Qt Creator——GDB 的跨平臺前端(除錯示例)。
- cgdb——模擬 vim 鍵對映的 ncurses 終端程式。
- ccdebug——使用 Qt 工具包的圖形 GDB 前端。
- Padb——具有與 GDB 平行的前端,使其可以針對並行應用程式。
- Allinea 分散式除錯工具——修改後的 GDB 版本的並行和分散式前端。
- Xcode——也包含 GDB 前端。
- SlickEdit——也包含 GDB 前端。
- Eclipse C/C++ 開發工具 (CDT) [2]——包括基於 GDB 的視覺化除錯工具。
- Jonathan B. Rosenberg, How Debuggers Work: Algorithms, Data Structures, and Architecture, John Wiley & Sons, ISBN 0-471-14966-7