  Researchers have developed numerous debugging approaches to help programmers
in the debugging process, but these approaches are rarely used in practice. In
this paper, we investigate how programmers debug their code and what
researchers should consider when developing debugging approaches. We conducted
an online questionnaire where 102 programmers provided information about
recently fixed bugs. We found that the majority of bugs (69.6 %) are semantic
bugs. Memory and concurrency bugs do not occur as frequently (6.9 % and 8.8 %),
but they consume more debugging time. Locating a bug is more difficult than
reproducing and fixing it. Programmers often use only IDE build-in tools for
debugging. Furthermore, programmers frequently use a
replication-observation-deduction pattern when debugging. These results suggest
that debugging support is particularly valuable for memory and concurrency
bugs. Furthermore, researchers should focus on the fault localization phase and
integrate their tools into commonly used IDEs.
