В чем разница между точкой останова (Breakpoint) и точкой наблюдения (Watchpoint) при отладке?

«В чем разница между точкой останова (Breakpoint) и точкой наблюдения (Watchpoint) при отладке?» — вопрос из категории Основы программирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Оба инструмента используются в отладчиках, но отслеживают разные события в программе.

  • Breakpoint (Точка останова): Останавливает выполнение программы при достижении определенной строки кода (инструкции). Используется для анализа состояния программы (значений переменных, стека вызовов) в конкретный момент.

  • Watchpoint (Точка наблюдения, или Break on Write): Останавливает выполнение программы при изменении значения конкретной переменной или области памяти. Незаменим для отслеживания места, где переменная неожиданно меняется.

Пример отладки на C с использованием GDB:

#include <stdio.h>

int main() {
    int important_value = 0; // За этой переменной установим watchpoint
    int counter = 0;

    for (counter = 0; counter < 5; counter++) {
        // Обычный breakpoint здесь остановит цикл на каждой итерации
        important_value = calculate(counter); // Watchpoint сработает ЗДЕСЬ, когда important_value изменится
        printf("Iteration %dn", counter);
    }

    return 0;
}

Команды GDB:

# Установка обычной точки останова на строку 10
(gdb) break 10

# Установка watchpoint на переменную important_value
(gdb) watch important_value
# Или для более эффективного отслеживания только записи:
(gdb) watch -l important_value

# Запуск программы
(gdb) run
# Выполнение остановится, когда important_value будет изменена в первый раз.

Почему это важно: Breakpoints отвечают на вопрос "где остановиться?", а Watchpoints — на вопрос "когда и где изменилась эта переменная?", что критически важно для поиска сложных ошибок, связанных с порчей данных.