Невозможно получить локальные переменные в vscode при отладке исполняемого файла golang

Создаю образец проекта на Голанге:

sampleapp/
sampleapp/main.go

который имеет следующий код:

package main

import (
    "flag"
    "fmt"
)

func main() {
    var name = flag.String("name", "user1", "user name")
    var age = flag.Int("age", 20, "user age")
    fmt.Println(*name)
    fmt.Println(*age)
}

Я следил за https://code.visualstudio.com/docs/editor/debugging и создал следующий launch.json

 {
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch file",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "${workspaceFolder}/main.go",
            "env": {},
            "args": []
        },
        {
            "name": "Launch exec",
            "type": "go",
            "request": "launch",
            "mode": "exec",
            "program": "${workspaceFolder}/sampleapp",
            "env": {},
            "args": []
        }
    ]
}

Когда я использую режим отладки Запустить файл, устанавливая точки останова на главном сервере, я могу выполнять пошаговое выполнение программы и видеть значения имени пользователя и age следующим образом:

введите здесь описание изображения

Но когда я использую режим отладки Launch exec после создания приложения, вот так:

go build

Я могу пошагово выполнить код, но раздел Local зависает, и счетчик работает постоянно и не показывает никаких локальных переменных, как показано ниже:

введите здесь описание изображения

Мне нужно сделать окно перезагрузки, чтобы избавиться от зависшего счетчика Local vars. Я проверил проблемы vscode и увидел https://github.com/microsoft/vscode-go/issues/2444, но в этом случае переменные не отображаются при панике. Но в моем случае я просто печатаю 2 переменные.

Я подумал, что это может быть проблема с моей установкой dlv, но когда я отлаживал с помощью dlv исполняемого файла, мне удалось получить значения (удаление ненужных строк из dlv):

dlv exec sampleapp
Type 'help' for list of commands.
(dlv) break main.main
Breakpoint 1 set at 0x109e1f3 for main.main() ./main.go:8
(dlv) s
> main.main() ./main.go:8 (hits goroutine(1):1 total:1) (PC: 0x109e1f3)
Warning: debugging optimized function
     3: import (
     4:         "flag"
     5:         "fmt"
     6: )
     7:
=>   8: func main() {
     9:         var name = flag.String("name", "user1", "user name")
    10:         var age = flag.Int("age", 20, "user age")
    11:         fmt.Println(*name)
    12:         fmt.Println(*age)
    13: }
(dlv) s
> main.main() ./main.go:9 (PC: 0x109e202)
Warning: debugging optimized function
     4:         "flag"
     5:         "fmt"
     6: )
     7:
     8: func main() {
=>   9:         var name = flag.String("name", "user1", "user name")
    10:         var age = flag.Int("age", 20, "user age")
    11:         fmt.Println(*name)
    12:         fmt.Println(*age)
    13: }
(dlv) s
> main.main() ./main.go:11 (PC: 0x109e29f)
Warning: debugging optimized function
     6: )
     7:
     8: func main() {
     9:         var name = flag.String("name", "user1", "user name")
    10:         var age = flag.Int("age", 20, "user age")
=>  11:         fmt.Println(*name)
    12:         fmt.Println(*age)
    13: }
(dlv) stepout
user1
> main.main() ./main.go:12 (PC: 0x109e31a)
Warning: debugging optimized function
     7:
     8: func main() {
     9:         var name = flag.String("name", "user1", "user name")
    10:         var age = flag.Int("age", 20, "user age")
    11:         fmt.Println(*name)
=>  12:         fmt.Println(*age)
    13: }
(dlv) p name
*"user1"
(dlv) p age
*20

Есть ли что-то очень простое, чего мне здесь не хватает?


person Saurabh Hirani    schedule 02.06.2019    source источник


Ответы (1)


Сначала я мог воспроизвести вашу проблему, но после обновления до VSCode версии 1.35.1 (я использую MacOSX) проблема исчезла. Я могу видеть значения переменных во время отладки с помощью «Launch exec»

Я думаю, что оптимизация компилятора сделала это проблематичным. Должно работать нормально для исполняемого файла, созданного с go build -gcflags=all="-N -l"

-N: disable optimization -l: disable inlining

Golang также официально предложил это: https://golang.org/doc/gdb

person Brian    schedule 14.06.2019
comment
Спасибо, Брайан, я обновился до vscode 1.35.1 на MacOS, но все еще не решил ту же проблему. :( - person Saurabh Hirani; 14.06.2019
comment
@SaurabhHirani Я попробовал еще раз сегодня утром, и я смог заставить его работать, только если я поставил точку останова в строке 12. Покопался немного глубже и думаю, что нашел проблему. Обновил свой ответ. - person Brian; 17.06.2019
comment
Спасибо, Брайан. Это помогло - использование build -gcflags = all = -N -l исправило одиночный шаг. Ваше здоровье! - person Saurabh Hirani; 17.06.2019
comment
У меня работал на Windows. Большое спасибо. - person zuraff; 25.11.2019