Golang在VSCode中使用GCC/CGO调试时遇到问题

Golang在VSCode中使用GCC/CGO调试时遇到问题 TLDR:目前我可以正常构建和运行Go代码,但无法在VSCode中进行调试。

到目前为止,我尝试在Windows上使用msys2和tdm-gcc来调用C语言库。设置好msys2后,我没有遇到任何错误,但开始调试后,dlv-dap不会在断点处停止。将鼠标悬停在断点上会显示类似 __debug_bin2735482890.exe not found 的信息。而使用tdm-gcc实际上会显示一个错误: [Content] Failed to launch: could not launch process: fork/exec C:\Users\User\AppData\Local\Temp\__debug_bin2735482890.exe: %1 is not a valid Win32 application.

那么,如何在Windows上设置可用的cgo环境?如果有人拥有与我类似的可正常工作的配置,能否展示一下您遵循的步骤?

>go env

set GO111MODULE=
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\User\AppData\Local\go-build
set GOENV=C:\Users\User\AppData\Roaming\go\env
set GOEXE=.exe
set GOEXPERIMENT=
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOINSECURE=
set GOMODCACHE=C:\Users\User\go\pkg\mod
set GONOPROXY=
set GONOSUMDB=
set GOOS=windows
set GOPATH=C:\Users\User\go
set GOPRIVATE=
set GOPROXY=https://proxy.golang.org,direct
set GOROOT=C:\Program Files\Go
set GOSUMDB=sum.golang.org
set GOTMPDIR=
set GOTOOLDIR=C:\Program Files\Go\pkg\tool\windows_amd64
set GOVCS=
set GOVERSION=go1.17.3
set GCCGO=gccgo
set AR=ar
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=NUL
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0 -fdebug-prefix-map=C:\Users\User\AppData\Local\Temp\go-build3886944430=/tmp/go-build -gno-record-gcc-switches
>gcc  --version
gcc (tdm64-1) 10.3.0                                           [tdm-gcc setup]

更多关于Golang在VSCode中使用GCC/CGO调试时遇到问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang在VSCode中使用GCC/CGO调试时遇到问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Windows上配置CGO调试环境需要确保调试器能正确处理混合的Go/C二进制文件。以下是基于你的环境配置的解决方案:

1. 安装正确的工具链

首先安装64位版本的TDM-GCC,确保与你的Go架构匹配:

# 卸载当前TDM-GCC,从 https://jmeubank.github.io/tdm-gcc/ 下载64位版本
# 安装时选择 "x86_64-w64-mingw32" 架构

2. 配置launch.json

在VSCode中创建或修改.vscode/launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch with CGO",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "${fileDirname}",
            "console": "integratedTerminal",
            "env": {
                "CGO_ENABLED": "1",
                "CC": "gcc",
                "CXX": "g++"
            },
            "buildFlags": "-ldflags=\"-linkmode=external\"",
            "dlvFlags": ["--check-go-version=false"]
        }
    ]
}

3. 验证环境配置

创建测试文件main.go验证配置:

package main

// #include <stdio.h>
// #include <stdlib.h>
// void hello() {
//     printf("Hello from C!\n");
// }
import "C"
import "fmt"

func main() {
    fmt.Println("Calling C function...")
    C.hello()  // 在此行设置断点
    fmt.Println("Back to Go")
}

4. 设置Go环境变量

在PowerShell或CMD中设置:

# 确保使用64位gcc
where gcc
# 应该显示类似: C:\TDM-GCC-64\bin\gcc.exe

# 设置环境变量
$env:CC = "gcc"
$env:CXX = "g++"
$env:CGO_ENABLED = "1"
$env:GOARCH = "amd64"

5. 调试配置检查

在VSCode中检查调试适配器配置,确保使用正确的Delve版本:

# 更新Delve到最新版本
go install github.com/go-delve/delve/cmd/dlv@latest
go install github.com/go-delve/delve/cmd/dlv-dap@latest

6. 工作配置示例

这是我的可工作配置(Windows 11 + Go 1.21 + TDM-GCC 64-bit):

> go env
set GOARCH=amd64
set CGO_ENABLED=1
set CC=C:\TDM-GCC-64\bin\gcc.exe
set CXX=C:\TDM-GCC-64\bin\g++.exe

> gcc --version
gcc (tdm64-1) 10.3.0
Copyright (C) 2020 Free Software Foundation, Inc.

.vscode/settings.json配置:

{
    "go.toolsEnvVars": {
        "CGO_ENABLED": "1",
        "CC": "gcc",
        "CXX": "g++"
    },
    "go.delveConfig": {
        "debugAdapter": "dlv-dap",
        "apiVersion": 2,
        "showGlobalVariables": true
    }
}

7. 调试示例代码

使用这个完整的示例测试调试:

package main

/*
#include <stdio.h>
#include <stdlib.h>

int add(int a, int b) {
    printf("C: Adding %d + %d\n", a, b);
    return a + b;
}
*/
import "C"
import (
    "fmt"
)

func main() {
    a := 10
    b := 20
    
    fmt.Println("Go: Starting calculation")  // 断点1
    
    result := int(C.add(C.int(a), C.int(b)))  // 断点2
    
    fmt.Printf("Go: Result is %d\n", result)  // 断点3
}

关键点:

  1. 确保GCC是64位版本
  2. 在VSCode配置中明确设置CC/CXX环境变量
  3. 使用--check-go-version=false避免版本检查问题
  4. 调试时使用console: "integratedTerminal"确保环境变量正确传递

如果仍有问题,检查Windows Defender或杀毒软件是否阻止了调试器创建临时可执行文件。

回到顶部