Я думаю, что ваш ответ не только о том, какое программное обеспечение вы используете, но и какую методологию вы используете. Я использую Emacs и зависит от TDD для большей части моей отладки. Когда я вижу, что что-то не получается, я обычно пишу тесты, заполняющие пробел, который я (очевидно) пропустил, и таким образом проверяю все ожидания. Так что каждый раз, когда я использую отладчик, все идет далеко друг от друга.
Когда я сталкиваюсь с проблемами, у меня есть несколько вариантов. В некоторых случаях я сначала использую valgrind, он может сказать мне, есть ли проблемы с памятью, устраняя необходимость в отладчике. Он будет указывать прямо на строку, где я перезаписываю или удаляю память, которую следует оставить в покое. Если я подозреваю, что состояние гонки у Вэлгринда это хорошо получается.
Когда я использую отладчик, я часто использую его прямо в emacs, в режиме GUD. Это даст мне представление со стеком, локальными переменными, исходным кодом, точками останова и окном, где я могу командовать отладчиком. Обычно это включает установку пары точек останова, просмотр некоторой памяти или оценки и пошаговое выполнение кода. Это очень похоже на использование отладчика в IDE. Отладчик GDB - мощный зверь, но мои проблемы никогда не были достаточно большими, чтобы задействовать его силу.