A debugger is an interactive program for setting breakpoints, inspecting variables and so on. However, a debugger is not strictly required to fix bugs.
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:
- Use cobra -d option to get debugging symbols so that uncaught exceptions will include source line numbers for the stack frames.
- Add more contracts in order to reveal the bug closer to its source.
- Add more unit tests to isolate and verify various behaviors expected of your methods and classes.
- Add more assert statements in the implementation to reveal the bug close to its source.
- Note that Cobra's assert is informative, meaning that upon failure it will show the values of each sub-expression in the asserted condition.
- Add trace statements to show both values as well as execution flow.
- Use the DetailedStackTrace to get more information when uncaught exceptions occur.
- Use the ObjectExplorer to browse and inspect objects and their related objects at run-time.
See also: DebuggingTopics