С какими инструментами для отладки работали
Что проверяют
Умеете ли вы искать причину, а не расставлять вывод в консоль по всему файлу. В C++ цена ошибки выше: неопределённое поведение, гонки и порча памяти проявляются далеко от места причины, поэтому инструмент выбирается под класс дефекта.
Как отвечать
Свяжите инструмент с типом проблемы:
- gdb и lldb: точки останова, условные и по изменению памяти через
watch, стек вызовов, разбор аварийного дампа черезbt; - санитайзеры:
-fsanitize=addressловит выход за границы и обращение к освобождённой памяти,undefinedловит переполнение знакового типа и разыменование нулевого указателя,threadнаходит гонки. Это первое, что включают при непонятном падении; - Valgrind: memcheck на утечки и неинициализированную память там, где пересборка невозможна, callgrind под профиль, helgrind под блокировки;
- perf: профиль по счётчикам процессора и флеймграф по горячим путям;
- статический анализ:
clang-tidy, cppcheck и предупреждения компилятора с-Wall -Wextraкак часть сборки; - rr: запись прогона и воспроизведение назад, спасает на плавающих дефектах.
Назовите и стратегию: стабильно воспроизвести, сузить до минимального примера, и только потом брать отладчик. Про релизные сборки скажите отдельно: символы с -g сохраняются, дампы собираются, иначе стек приходит без имён.
Где спотыкаются
Отлаживают только отладочную сборку. Оптимизация меняет порядок и тайминги: гонка в релизе есть, а под отладчиком пропадает. Тут полезнее санитайзер потоков и запись прогона, чем пошаговое выполнение.
Считают Valgrind профайлером. Memcheck ищет ошибки работы с памятью и замедляет программу в разы, для скорости берут perf или callgrind.
Ищут причину там, где программа упала. Порча кучи проявляется в произвольном месте гораздо позже, и без санитайзера поиск идёт по симптому, а не по источнику.