Delve не работает во время отладки Голанга против кода - PullRequest
0 голосов
/ 15 ноября 2018

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

enter image description here

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

enter image description here

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

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)
    }
}

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

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

0 голосов
/ 15 ноября 2018

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

...