Golang: debugging CLI applications in VSCode

VSCode, also known as Visual Studio Code, is a highly versatile and feature-rich code editor that has won the hearts of developers worldwide. With its clean and intuitive interface, it provides a delightful coding experience, making it a top choice for many professionals and enthusiasts alike.

In a previous article of mine we saw how to configure useful user snippets. Now I want to explore its debugging capabilities.

In this short article we’ll see how to debug a CLI app written in Golang.

Sample CLI

Here’s our very simple app which takes command line arguments:

cmd/main.go

package main

import (
    "fmt"
    "os"

    "github.com/jessevdk/go-flags"
)

var opts struct {
    Name  string `short:"n" long:"name" description:"name" required:"true"`
    Age   int    `short:"a" long:"age" description:"age" required:"true"`
    Email string `short:"e" long:"email" description:"email" required:"true"`
}

func run(args []string) {
    flags.ParseArgs(&opts, args)
    fmt.Printf("opts.Name: %v\n", opts.Name)
    fmt.Printf("opts.Age: %v\n", opts.Age)
    fmt.Printf("opts.Email: %v\n", opts.Email)
}

func main() {
    run(os.Args)
}

Once again, like I did in this article about Golang, Kafka and MongoDB real time data processing, I’m using github.com/jessevdk/go-flags instead of the core flag package, since it has several advantages.

To run it, we do:

$ go run cmd/main.go --name Tiago --age 39 --email tiago@email.com
Name: Tiago
Age: 39
Email: tiago@email.com

Nice. Of course, we’re not doing anything useful in this simple app. But what if we have a complex CLI app and need to debug it?

Debugging it

In VSCode, click on “Run and Debug” and then “create a launch.json file”:

No alt text provided for this image

Next, select “Go: Launch Package” option and hit enter:

No alt text provided for this image

Then, we’ll replace the sample JSON with this one:

{
    // 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 Package",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "cmd/main.go",
            "args": [
                "--name",
                "Tiago",
                "--age",
                "39",
                "--email",
                "tiago@email.com"
            ]
        }
    ]
}
  • program is the path to the file that contains the `main` function
  • args is the string array where you pass the desired command line arguments

When you save it, the “Run and Debug” view will look like this:

No alt text provided for this image

Now let’s come back to our `cmd/main.go` file and put a break point:

No alt text provided for this image

Similarly to other IDEs, you put a break point by double clicking on the left side of the line number.

Now, back to “Run and Debug” view, just click on the green play icon:

No alt text provided for this image

Then the debug little toolbar will be displayed enabling us to continue, step over, step into, step out, restart and stop the debugging session. We’ll see the output in “debug console”.