#go #delve
#Вперед #углубиться
Вопрос:
Недавно у меня возникла проблема, которая, по сути, делает отладку с использованием delve практически невозможной. В принципе, я не могу использовать точки останова, иначе есть большая вероятность, что отлаженный код зависнет, и все, что я могу сделать, это остановить перезапуск отладчика.
Чтобы начать с самого начала… В течение некоторого времени у меня периодически возникали проблемы с отладкой Go с использованием GoLand IDE (2019.1) и delve (1.0.0-rc2). Весь сеанс зависнет — я знаю, что ничего не происходит, потому что загрузка процессора отлаженного процесса равна нулю, и тот факт, что в журнал не записываются сообщения (у меня есть много подпрограмм, большинство из которых пишут случайные сообщения журнала). Это как если бы была достигнута точка останова, Но команды отладчика (ШАГ и т. Д.) Не Включены, Что указывает на то, что отладчик не находится в точке останова. Когда это происходит, я должен дважды нажать кнопку остановки GoLand, чтобы завершить работу отладчика, а затем начать все сначала.
В последнее время эта проблема стала гораздо более распространенной. Возможно, от нескольких раз в день до почти каждого сеанса отладки. Это раздражает, но, по крайней мере, это позволило мне отследить то, что, по моему мнению, является основной проблемой. Кажется, что иногда, когда встречается точка останова, отладчик останавливается, но delve или IDE этого не понимают, поэтому продолжить невозможно.
Откуда я это знаю? Я доказал это себе, установив точку останова в строке журнала (т.Е. Журнал.Printf). Когда точка останова находится на этой строке (и я знаю, что она будет нажата), сеанс отладки зависает. Если я гарантирую, что не будет никаких точек останова, то программа работает абсолютно нормально, включая печать строки журнала. Если я установлю (одну и единственную) точку останова в строке после строки журнала, строка журнала будет напечатана, и сеанс зависнет.
Я думаю, что это проблема с delve. Обратите внимание, что я загрузил один и тот же проект в VSCode, и происходит то же самое (GoLand и VSCode используют одну и ту же версию delve), поэтому я не думаю, что GoLand делает что-то неправильно. Но если у кого-то есть другое объяснение, я приветствую его.
Я много чего перепробовал, чтобы отследить причину. Я создал небольшой проект, чтобы продемонстрировать проблему, но она не возникает в простом проекте. Похоже, я делаю что-то не так (в моем большом проекте), что приводит к неправильному поведению delve, но я понятия не имею, что это такое.
Комментарии:
1. У меня все еще есть проблема, и я провел много исследований. Есть намеки на подобные проблемы, но, похоже, никто другой не сталкивался с этой огромной проблемой с delve. Я подозреваю, что это связано с Windows (и большинство из них используют debugger в Linux), поэтому я изменил название, чтобы отразить это.
2. Сейчас я воспроизвел эту проблему в очень простом проекте, если кому-то интересно.
Ответ №1:
Во-первых, 1.0.0-rc2 кажется удобным для углубления: текущая версия 1.2.0
1.0.0-rc2 настолько древний, что в августе 2018 года была обнаружена аналогичная ошибка (выпуск 1318), касающаяся безголового выполнения delve:
dlv debug --headless ...
Добавление --log --log-output=rpc
может дать вам дополнительные подсказки.
dlv debug --headless --listen=:2345 --api-version=2 --log --log-output=rpc ./test.go
Сам Delve в безголовом режиме будет игнорировать SIGINT.
Чтобы остановить экземпляр без головы, вы должны подключиться к нему, а затем разорвать соединение.
Чтобы отправить SIGINT целевой программе, вы должны запустить целевую программу, чего вы не сделали, потому что для запуска целевой программы вам сначала нужно подключиться к delve.
Комментарии:
1. Извините, я забыл упомянуть, что я обновился до 1.2.0, и ничего не изменилось. Спасибо за информацию о командной строке delve — я посмотрю, смогу ли я ее использовать.
2. Извините, я должен был дать вам награду. (Я не понимал, что он просто исчез, если не использовался.) Я собирался увеличить его до 100, но теперь я знаю, как это работает, я никогда больше не буду использовать награду.
3. @AJR Нет проблем. Надеюсь, этот ответ может помочь другим.
4. Я имел в виду, что должен был дать вам награду, поскольку в противном случае она была потрачена впустую, и вы предоставили полезный комментарий. Проблема по-прежнему возникает при отладке GoLand, VSCode и командной строки, но, похоже, это происходит реже с последней версией Delve.