Создаю образец проекта на Голанге:
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 strong > следующим образом:
Но когда я использую режим отладки 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
Есть ли что-то очень простое, чего мне здесь не хватает?