Как настроить сеанс отладки VScode для Golang и AppEngine?

VScodeDebugGoAppEngine

Учебник Hello World, в котором показано, как настроить VS Code для отладки кода Golang App Engine с помощью Visual Studio (также известного как VScode).

Здесь используется код Helloworld из документации AppEngine:

go get -u -d github.com/directmeasure/VScodeDebugGoAppEngine.git

на Mac под управлением osX 10.13.3.

Я протестировал код, сервер работает локально. Я пытаюсь понять, как войти в код с помощью отладчика, чтобы научиться использовать отладчик в других проектах.

Это были лучшие инструкции, которые я смог найти для использования VScode с GAE, но они кажутся устаревшими на основе обновлений Golang (например, переход на Gcloud, флаг -go_debugging и изменение структуры каталогов):
https://medium.com/@dbenque/debugging-golang-appengine-module-with-visual-studio-code-85b3aa59e0f

Вот шаги, которые я предпринял:

настроить среду

  • добавлен в .bash_profile

    export BASEFOLDER="/Users/Bryan/google-cloud-sdk/" . 
    export GOROOT="/usr/local/go" # this shoudln't have to be set with current Version, doing it to follow the tutorial . 
    

Как я пытался запустить отладчик:

запустить локальный сервер.

dev_appserver.py --go_debugging=true app.yaml

прикрепить локальный двоичный файл к Delve

 ps aux | grep _go_app 

dlv attach <#using the PID from the server binary>

Delve успешно подключается к двоичному файлу.

Когда я запускаю сеанс отладки, синий индикатор выполнения никогда не прекращает сканирование по горизонтали.

Боковая панель VARIABLE никогда не заполняется переменными в hello.go

Точка останова установлена ​​на hello.go: строка 21

Терминал Debug REPL отображает:

Verbose logs are written to:  
/var/folders/mw/0y88j8_54bjc93d_lg3120qw0000gp/T/vscode-go-debug.txt  
16:02:31, 2018-4-5  
InitializeRequest  
InitializeResponse  
Using GOPATH: /Users/Bryan/go  
fmt.Print(u)  
Please start a debug session to evaluate  

Вот конфигурация launch.json:

{
    "version": "0.2.0",  
    "configurations": [   
    {
        "name": "Launch",
        "type": "go",
        "request": "launch",
        "mode": "debug",
        "remotePath": "",
        //"port": 1234,  
        "port": 2345   // docs say port should match assigned port headless server, https://github.com/Microsoft/vscode-go/wiki/Debugging-Go-code-using-VS-Code#remote-debugging
                         // this creates bind error
        "host": "127.0.0.1",
        "program": "${workspaceFolder}/hello.go",
        "env": {},
        "args": [],
        "showLog": true,
        "trace": true,
    }
    ]
}

Вот версии, которые я установил:

go version go1.10 darwin/amd64  
$ gcloud version . 
Google Cloud SDK 197.0.0
app-engine-go 
app-engine-python 1.9.68
bq 2.0.31
core 2018.04.06
gsutil 4.30

VS code extension:
Go 0.6.78

РЕДАКТИРОВАТЬ###########################

$ lsof -n -i :8080
Bryan@Bryans-MacBook-Pro Thu Apr 12 17:02:04 ~ 
$ lsof -n -i :2345

Bryan@Bryans-MacBook-Pro Thu Apr 12 17:03:34 ~ 
$ ps aux | grep _go_app
Bryan             7433   0.0  0.0  2434840    800 s000  S+    5:03PM   0:00.00 grep _go_app
Bryan             7426   0.0  0.0 556603172   3896 s002  S+    5:02PM   0:00.01 /var/folders/mw/0y88j8_54bjc93d_lg3120qw0000gp/T/tmp8GWk1gappengine-go-bin/_go_app

Bryan@Bryans-MacBook-Pro Thu Apr 12 17:03:52 ~ 
$ dlv attach --headless -l "localhost:2345" 7426 /var/folders/mw/0y88j8_54bjc93d_lg3120qw0000gp/T/tmp8GWk1gappengine-go-bin/_go_app
API server listening at: 127.0.0.1:2345

Когда я запускаю отладчик, REPL показывает:

Verbose logs are written to:
/var/folders/mw/0y88j8_54bjc93d_lg3120qw0000gp/T/vscode-go-debug.txt
couldn't start listener: listen tcp 127.0.0.1:2345: bind: address already in use
Process exiting with code: 1

person BryanWheelock    schedule 16.03.2018    source источник
comment
Вы должны переключить инструменты разработчика и посмотреть, отображается ли консоль в каких-либо исключениях, иногда этот индикатор выполнения означает, что в JS-коде VSCode было исключение.   -  person Tarun Lalwani    schedule 03.04.2018
comment
Я считаю, что ответ Тайлера должен помочь. Пожалуйста, проверьте и обновите   -  person Tarun Lalwani    schedule 10.04.2018


Ответы (2)


VS Code никогда не подключается к Delve, потому что он ожидает подключения к удаленному серверу Delve в 127.0.0.1:2345. Если вы dlv attach в автономном режиме, прослушивая правильный адрес, мы надеемся, что вы сможете подключиться.

Приведенные ниже шаги описывают, как отлаживать приложение Go App Engine, работающее с dev_appserver.py и никакими другими инструментами / помощниками. Однако, когда вы вносите изменения в свой код Go, dev_appserver.py перекомпилирует и перезапускает приложение, изменение PID Delve необходимо для отладки. http://github.com/dbenque/delveAppengine может помочь сохранить привязку Delve к нужному процессу. См. Руководство здесь.

  1. Установите расширение VS Code Go.
  2. go get -u -d github.com/directmeasure/VScodeDebugGoAppEngine.git
  3. cd $GOPATH/src/src/github.com/GoogleCloudPlatform/golang-samples/appengine/helloworld

    Примечание: если ваш GOPATH имеет более одной записи, cd в каталог, в который go get загружен.

  4. Запустите сервер разработки App Engine:

    dev_appserver.py --go_debugging=true app.yaml

  5. Посетите http://localhost:8080, чтобы убедиться, что сервер работает.
  6. Найдите PID процесса Go:

    ps aux | grep _go_app

  7. Запустите сервер Delve (выберите любой порт, доступный в вашей системе):

    dlv --headless -l "localhost:2345" attach $GO_APP_PID

  8. Откройте вкладку отладки VS Code (⇧⌘D в macOS, Ctrl + Shift + D в Windows и Linux).
  9. Создайте новую конфигурацию запуска, щелкнув шестеренку и выбрав любую запись (см. Официальные документы здесь < / а>).
  10. Создайте запись "Go: Connect to server": выпадающий список create config

    Примечание: это всего лишь шаблон - вы можете отредактировать его позже.

  11. Настройте конфигурацию так, чтобы она указывала на порт, который вы указали при запуске Delve. Вот моя полная конфигурация:

    {
        "name": "Launch",
        "type": "go",
        "request": "launch",
        "mode": "debug",
        "remotePath": "",
        "port": 2345,
        "host": "127.0.0.1",
        "program": "${fileDirname}",
        "env": {},
        "args": [],
        "showLog": true
    }
    
  12. Добавьте нужные точки останова и снова посетите http://localhost:8080. Выполнение должно останавливаться при достижении точки останова, переменные должны быть перечислены в разделе переменных в VS Code, а стек вызовов должен находиться в разделе стека вызовов.

Для получения общей справки по отладке кода Go в VS Code (не запускается с App Engine) см. https://github.com/Microsoft/vscode-go/wiki/Debugging-Go-code-using-VS-Код.

person Tyler Bui-Palsulich    schedule 09.04.2018
comment
Разве порт в файле launch.json не должен совпадать с назначенным портом на сервере без головы Delve? - person BryanWheelock; 10.04.2018
comment
да. Ты прав. Отредактировал пост по поправке порта. - person Tyler Bui-Palsulich; 10.04.2018
comment
В документах говорится, что порт, назначенный безголовому серверу Delve, должен соответствовать конфигурации порта в launch.js, но это создает ошибку привязки. Когда я меняю порт в конфигурации, Debug REPL показывает прослушивание сервера API, но подоконник отладчика не показывает переменные. - person BryanWheelock; 11.04.2018
comment
Порт, указанный в dlv --headless -l "localhost:2345" attach, обязательно должен совпадать со строкой "port": 2345, в конфигурации. Я бы посоветовал проверить lsof -n -i :2345 и lsof -n -i :8080 (или любые другие порты, которые вы пытаетесь использовать), чтобы убедиться, что все в порядке, прежде чем все запускать. - person Tyler Bui-Palsulich; 11.04.2018
comment
Я проверил, что порт 2345 не используется, прежде чем подключать Delve, и у меня все еще есть ошибка привязки. См. РЕДАКТИРОВАТЬ выше. - person BryanWheelock; 13.04.2018

Да, это устарело. Страница, с которой вы переходите, не существует. Вместо этого вы можете запустить

go get github.com/GoogleCloudPlatform/golang-samples/tree/master/appengine/helloworld/...
person Victor Oliveira    schedule 16.03.2018
comment
Проблема не в получении кода Helloworld. Я загрузил код helloworld. Оно работает. Я не могу понять, как запустить отладчик. - person BryanWheelock; 17.03.2018