В какой-то момент начинает требоваться отладить программу, которую нельзя отладить на рабочем компьютере. В моем случае потребовалось отладить программу, общающуюся по D-Bus с iwd, демоном, заведующим соединениями по Wi-Fi, на ноутбуке.
В VSCode есть аддон Remote Development, специально предназначенный для подобных случаев. Меня он не устраивал по нескольким причинам:
Автоматическое подписание коммитов GnuPG из VSCode не заработало.
Не заработал SSH-агент (вероятно, из-за отключенного проброса агента).
Не заработало, казалось бы, имеющееся в RD открытие локальной директории на удаленной машине (часть нужных файлов не была включена в версионный контроль, а ручным копированием по сети каждый раз заниматься не хотелось).
Я пишу на Go, так что хак, который я буду описывать, предназначен для отладчика Delve. Сам подход меняется мало вне зависимости от языка программирования; аналогичное можно сделать с используемым в VSCode для Python ptvsd и любым другим отладчиком, позволяющим удаленные соединения.
TL;DR поста
Пишем скрипт, собирающий бинарник с поддержкой отладки, копирующий ее на целевую машину по SCP и запускающий Delve.
Создаем в VSCode профиль отладки, аттачащийся к целевой машине.
Создаем в VSCode таск, запускающий скрипт из п.1 и добавляем его в зависимости профиля отладки.
Отладка в контейнерной среде – дело не самое простое, поэтому разработчики зачастую прибегают к неэффективным методам локализации ошибок на этапе развертывания. Быстрее и красивее будет использовать отладчик на удаленном сервере, задав точки останова для поиска причин неполадок.
Именно этот вариант мы рассмотрим сегодня и покажем, как запускать отладчик на кластере Kubernetes через IDE-среду Visual Studio Code (VS Code). В качестве приложения у нас будет программа на Go, но всё изложенное вполне применимо и к другим языкам программирования и отладчикам.
Отладка не должна быть частью разработки, потому что она непродуктивна и отнимает много времени. В идеале код нужно сразу делать чистым, понятным и покрывать тестами. Но хотя современные подходы к разработке ПО не подразумевают дальнейшей отладки, мы каждый день продолжаем сталкиваться с унаследованным кодом, который может быть не покрыт тестами, быть сложным и запутанным. И в результате нам всё же приходится заниматься этим неблагодарным делом.
Сегодня есть множество IDE, поддерживающих работу с Go и позволяющих отлаживать приложения. На текущий момент для Go представлены два отладчика: GDB (но он не поддерживает многие фичи языка, например Go-рутины) и Delve. Многие IDE используют последний как дефолтный отладчик. И в этой статье я расскажу о возможностях Delve: о том, что умеет сам отладчик, а не что нам предоставляет IDE.