Go Delve (1.0.0-rc2) зависает в Windows после достижения точки останова - PullRequest
3 голосов
/ 17 апреля 2019

Недавно у меня возникла проблема, которая по существу делает невозможной отладку Go с использованием delve.В принципе, я не могу использовать точки останова, иначе есть хороший шанс, что отладочный код зависнет, и все, что я могу сделать, это остановить перезапуск отладчика.

Чтобы начать с самого начала ... У меня возникла периодическая проблема отладкиПойдите, используя GoLand IDE (2019.1) и delve (1.0.0-rc2) в течение некоторого времени.Весь сеанс зависнет - я знаю, что ничего не происходит, потому что загрузка ЦП отлаженного процесса равна нулю, и тот факт, что в журнал не записывается никаких сообщений (у меня много подпрограмм, большинство из которых пишут случайные сообщения журнала),Это как если бы была достигнута точка останова, но команды отладчика (STEP и т. Д.) Не включены, что указывает на то, что отладчик не в точке останова.Когда это происходит, я должен нажать кнопку GoLand STOP дважды , чтобы завершить отладчик, а затем начать все заново.

В последнее время эта проблема стала гораздо более распространенной.От, возможно, несколько раз в день до почти каждого сеанса отладки.Это раздражает, но по крайней мере это позволило мне отследить то, что, по моему мнению, является основной проблемой.Кажется, что иногда, когда встречается точка останова, отладчик останавливается, но делится, или среда IDE не осознает этого, поэтому продолжения нет.

Как мне это узнать?Я доказал это себе, установив точку останова в строке журнала (то есть, log.Printf).Когда точка останова находится на этой линии (и я знаю, что она будет достигнута), сеанс отладки останавливается.Если я гарантирую, что нет точек останова, которые будут достигнуты, тогда программа будет работать абсолютно нормально, включая печать строки журнала.Если я установлю (одну-единственную) точку останова в строке после строки журнала, будет напечатана строка журнала, и сессия замерзнет.

Я думаю, что это проблема с delve.Обратите внимание, что я загрузил тот же проект в VSCode, и происходит то же самое (GoLand и VSCode используют одну и ту же версию delve), поэтому я не думаю, что GoLand делает что-то не так.Но если у кого-то есть другое объяснение, я приветствую это.

Я много чего пытался найти причину.Я создал небольшой проект, чтобы продемонстрировать проблему, но она не возникает в простом проекте.Похоже, что я делаю что-то не так (в моем большом проекте), что приводит к неправильному поведению delve, но я понятия не имею, что это такое.

1 Ответ

0 голосов
/ 07 июля 2019

Во-первых, 1.0.0-rc2 кажется устаревшим для Delve: текущая версия 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

Погружение в безголовом режиме игнорирует SIGINT.
Чтобы остановить безголовый экземпляр, необходимо подключиться к нему, а затем разорвать соединение.
Чтобы отправить SIGINT в целевую программу, вы должны запустить целевую программу, чего вы не сделали, потому что для запуска целевой программы вам нужно сначала подключиться к delve.

...