Ответ
В работе с C++ проектами я активно использую следующий инструментарий:
- Отладчики: GDB (с расширениями типа
gdb-dashboardилиpwndbg) и LLDB (особенно в macOS/iOS среде). Для анализа дампов памяти (core dumps) они незаменимы. - Детекторы ошибок памяти: Valgrind (Memcheck) — классика для поиска утечек, некорректных доступов к памяти. В современных проектах чаще использую AddressSanitizer (ASan), LeakSanitizer (LSan) и UndefinedBehaviorSanitizer (UBSan), встроенные в компиляторы GCC/Clang, так как они значительно быстрее.
# Компиляция с AddressSanitizer g++ -fsanitize=address -g -O1 my_program.cpp -o my_program - Профилировщики:
perf(Linux) для системного профилирования и анализа производительности. Valgrind Callgrind/Cachegrind для детального анализа кэш-промахов и графа вызовов. Для профилирования непосредственно в коде использую Google Benchmark. - Статические анализаторы: Clang-Tidy для проверки стиля и поиска потенциальных багов, Cppcheck.
- Трассировка:
strace/ltraceдля отладки взаимодействия с ОС и сторонними библиотеками.
Ответ 18+ 🔞
Ну, представляешь, сидишь ты такой, пишешь код на плюсах, а он нихера не работает. Или работает, но потом падает в какую-то дичь, и ты сидишь, как дурак, и думаешь: «Какого хуя?». Вот чтобы не сойти с ума, я, блядь, оброс целым арсеналом штук, которые помогают не вырвать себе волосы с корнем.
Первое дело — отладчики. Без них вообще никуда, это как руки. GDB — старая добрая классика, ёпта. Сам по себе он, конечно, суровый, как северный олень, но если навесить на него всякие расширения вроде gdb-dashboard или pwndbg, то жить становится проще, блядь. А на маках и айфонах царствует LLDB. И если программа накрылась медным тазом и оставила после себя труп — core dump, то без этих ребят ты как без рук, нихера не разберёшь.
Дальше идёт самое весёлое — поиск утечек памяти и прочей дичи. Раньше все молились на Valgrind (Memcheck), и он, конечно, священная корова, но работает, блядь, медленнее черепахи в сиропе. Поэтому сейчас, если проект не древний, как мамонт, я сразу врубаю AddressSanitizer (ASan), LeakSanitizer (LSan) и UndefinedBehaviorSanitizer (UBSan). Они вшиты прямо в GCC и Clang, и работают в разы быстрее. Просто добавляешь флажок при компиляции, и всё, волнение ебать отступает.
# Компиляция с AddressSanitizer
g++ -fsanitize=address -g -O1 my_program.cpp -o my_program
Потом начинается этап «а почему оно тормозит?». Тут на сцену выходят профилировщики. На линуксе perf — это просто царь и бог, чтобы понять, куда система тратит время. Нужно покопаться глубже, посмотреть на кэш-промахи? Тогда Valgrind Callgrind/Cachegrind тебе в помощь, хотя и ждать придётся. А если хочется померить скорость конкретных кусков кода прямо изнутри, то Google Benchmark — твой лучший друг, чувак.
Ну и, конечно, чтобы не выглядеть полным распиздяем, нужно прогонять код через статические анализаторы. Clang-Tidy и Cppcheck — они как занудные, но очень умные учителя, которые тычут тебя носом в твои же косяки, которые ты сам уже замылил глазом. Иногда от их замечаний сам от себя охуеваешь: «И как я это пропустил?».
И последний штрих — когда программа делает что-то совсем уж невменяемое и непонятно, с кем она там общается. Тут спасают strace и ltrace. Первый показывает все системные вызовы, второй — вызовы в библиотеках. Включаешь, запускаешь программу и смотришь, куда она лезет, что открывает и что читает. Часто ответ на вопрос «почему не работает?» лежит именно там. В общем, без этого всего в серьёзной разработке — просто пиздец, а не жизнь.