Delve не работает во время отладки golang в vs code

Я изучаю golang и пытаюсь отладить пример кода из одной из моих книг по golang. Очень странно, что отладчик delve не работает должным образом.

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

Как вы можете видеть на этом рисунке, я могу установить точку останова в строке 83 и продолжить выполнение программы до этой точки останова. На левой панели я вижу, как отображаются переменные и стек вызовов. Но когда я перехожу к следующему оператору из этой точки останова, отладчик, похоже, останавливается. Все переменные очищены, но стек вызовов по-прежнему показывает мне, что проблема работает, как показано на рисунке ниже:

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

Я также пробовал копаться в отладчике в командной строке (вне кода), у меня возникла та же проблема в той же точке останова.

VS-Code launch.json, как показано ниже:

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "${fileDirname}",
            "env": {},
            "args": [],
            "trace": true
        }
    ]
}

Версия Go: 1.10.3 windows/amd64

Версия отладчика Delve: 1.1.0

Версия VS-кода: 1.29.0

Нужна ли мне другая конфигурация?

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

Исходный код:

package main

import (
    "bufio"
    "fmt"
    "io"
    "log"
    "os"
    "path/filepath"
    "regexp"
)

func filenamesFromCmdLine() (inFilename, outFilename string, err error) {
    if len(os.Args) > 1 && (os.Args[1] == "-h" || os.Args[1] == "--help") {
        err = fmt.Errorf("Usage: %s [<]infile.txt [>]outfile.txt", filepath.Base(os.Args[0]))
        return "", "", err
    }

    if len(os.Args) > 1 {
        inFilename = os.Args[1]
    }
    if len(os.Args) > 2 {
        outFilename = os.Args[2]
    }
    if inFilename != "" && inFilename == outFilename {
        log.Fatal("won't overwrite the infile")
    }

    return inFilename, outFilename, nil
}

func americanise(inFile io.Reader, outFile io.Writer) (err error) {

    reader := bufio.NewReader(inFile)
    writer := bufio.NewWriter(outFile)
    defer func() {
        if err == nil {
            err = writer.Flush()
        }
    }()

    var replacer func(string) string

    wordRx := regexp.MustCompile("[A-Za-z]+")
    eof := false
    for !eof {
        var line string
        line, err = reader.ReadString('\n')
        if err == io.EOF {
            err = nil
            eof = true
        } else if err != nil {
            return err
        }
        line = wordRx.ReplaceAllStringFunc(line, replacer)
        if _, err = writer.WriteString(line); err != nil {
            return err
        }
    }

    return nil
}

func main() {
    inFilename, outFilename, err := filenamesFromCmdLine()
    if err != nil {
        fmt.Println(err)
        os.Exit(0)
    }

    //why we initialize them to stdin and stdout?
    //the file object has been set to os.Stdin and os.Stdout
    inFile, outFile := os.Stdin, os.Stdout

    if inFilename != "" {
        //os.Open() returns *os.File that can be used for reading the file.
        if inFile, err = os.Open(inFilename); err != nil {
            log.Fatal(err)
        }
        //defer inFile.Close()
    }

    if outFilename != "" {
        //create a new file or truncate to zero length for existing file
        if outFile, err = os.Create(outFilename); err != nil {
            log.Fatal(err)
        }
        defer outFile.Close()
    }

    if err = americanise(inFile, outFile); err != nil {
        log.Fatal(err)
    }
}

person Jeffrey Yang    schedule 15.11.2018    source источник


Ответы (2)


К сожалению, Delve в VS-Code плохо обрабатывает «Перейти к следующему шагу», когда вы выполняете несколько процедур перехода, каждая из которых ожидает перехода к следующему шагу. Один обходной путь, который я использую, заключается в том, что я помещаю еще одну точку отладки, где я хочу остановить отладку, а затем выбираю опцию «Продолжить».

person viggy    schedule 15.11.2018

Я не уверен в вашей ситуации, но в предыдущих версиях vscode-go была ошибка. Ваша версия 0.7.0?

person Magiq    schedule 15.11.2018
comment
да, моя версия плагина vscode-go — 0.7.0, кстати, я попробовал отладчик delve в командной строке (вне кода), но у меня возникла та же проблема. - person Jeffrey Yang; 15.11.2018