| 1 | A debugger is an interactive program for setting breakpoints, inspecting variables and so on. However, a debugger is not strictly required to fix bugs. |
| 2 | |
| 3 | The fundamental requirement is to correct your understanding of how your program is behaving in the context of the inputs and environment in which the bug occurs. Of course, a debugger helps you gain that understanding, but there are also non-debugger-based techniques to do so: |
| 4 | |
| 5 | * Add more contracts in order to reveal the bug closer to its source. |
| 6 | * Add more unit tests to isolate and verify various behaviors expected of your methods and classes. |
| 7 | * Add more assert statements in the implementation to reveal the bug close to its source. |
| 8 | * Note that Cobra's `assert` is ''informative'', meaning that upon failure it will show the values of each sub-expression in the asserted condition. |
| 9 | * Add `trace` statements to show both values as well as execution flow. |
| 10 | * Use the ObjectExplorer to browse and inspect objects and their related objects at run-time. |
| 11 | |
| 12 | See also: DebuggingTopics |