在vscode上使用stdin调试go程序

在vscode上调试go程序时,如果程序中带有scanf等从stdin读取数据的代码,运行到stdin语句处会导致调试过程无法进行。本文介绍一种规避方法,以达到vscode debug时使用stdin的目的。

修改launch.json

luanch.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": "Attach Package",
            "type": "go",
            "request": "attach",
            "mode": "remote",
            "host": "127.0.0.1",
            "port": 37293
        }
    ]
}

启动dlv调试server

必须在与待调试文件相同的路径下启动dlv程序,port要与上文launch.json中填入的端口号相对应。

dlv debug --headless --listen=:37293 --log --api-version=2

启动调试

f5启动调试后,在terminal中输入程序要从stdin读取的值,按回车确认,程序可成功执行到下个断点处。

img.png

Tips

调试命令过长,可在~/.zshrc中使用alias命令添加别名:

alias vscode-debug="dlv debug --headless --listen=:37293 --log --api-version=2"

参考

Visual Studio Code 调试Go程序的os.Stdin输入

Launch.json attributes