使用STS进行Golang调试的技巧与实践

使用STS进行Golang调试的技巧与实践 大家好,

最近几天,我一直在努力尝试使用 GDB 调试 Go 程序,但遇到了困难。我需要为以下工具和 IDE 寻找调试器工具。

框架 - STS IDE - goclipse

操作系统 - MAC

GDB 无法正常工作。我遇到的错误如下:

这是一个错误,请报告它。有关说明,请参阅:

https://www.gnu.org/software/gdb/bugs/

…/…/gdb/thread.c:95: internal-error: struct thread_info *inferior_thread(): Assertion `current_thread_ != nullptr’ failed.

GDB 内部检测到问题, 进一步的调试可能不可靠。

是否创建 GDB 的核心转储文件?(y 或 n) [已选择 Y;输入并非来自终端]。

非常感谢任何建议或解决方案。


更多关于使用STS进行Golang调试的技巧与实践的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于使用STS进行Golang调试的技巧与实践的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


对于在STS(Spring Tool Suite)中调试Go程序时遇到的GDB问题,这通常是由于macOS系统限制和Go调试工具链的特殊性导致的。以下是针对macOS环境的解决方案和替代调试方法:

1. 使用Delve替代GDB(推荐)

Delve是Go语言专用的调试器,比GDB更适合Go程序:

# 安装Delve
go install github.com/go-delve/delve/cmd/dlv@latest

# 验证安装
dlv version

2. 在STS/goclipse中配置Delve调试

步骤1:创建调试配置

在STS中:

  1. 右键项目 → Debug As → Debug Configurations
  2. 创建新的Go Debug配置
  3. 设置调试器类型为"Delve"

步骤2:配置launch.json(如果使用VSCode扩展)

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "${workspaceFolder}/main.go",
            "env": {},
            "args": []
        }
    ]
}

3. 命令行使用Delve调试

# 编译并调试程序
dlv debug main.go

# 设置断点
(dlv) break main.main
(dlv) break main.go:15

# 运行程序
(dlv) continue

# 单步执行
(dlv) next
(dlv) step

# 查看变量
(dlv) print variableName
(dlv) locals

# 查看goroutine
(dlv) goroutines
(dlv) goroutine 1

# 退出调试
(dlv) quit

4. 使用Delve的远程调试功能

// 在代码中启动Delve远程调试
import _ "github.com/go-delve/delve/service/dap"

// 编译时添加调试信息
go build -gcflags="all=-N -l" -o myapp main.go

// 启动远程调试服务器
dlv exec ./myapp --headless --listen=:2345 --api-version=2 --log

5. 在goclipse中配置Delve

如果goclipse支持Delve:

  1. 打开Preferences → Go → Debugger
  2. 选择"Delve"作为调试后端
  3. 配置Delve路径:$GOPATH/bin/dlv
  4. 设置调试参数:
    --check-go-version=false
    --headless=true
    --listen=:2345
    

6. 替代方案:使用Visual Studio Code

如果STS/goclipse调试支持有限,可以考虑VSCode:

// .vscode/launch.json
{
    "configurations": [
        {
            "name": "Launch Package",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "${fileDirname}",
            "dlvFlags": ["--check-go-version=false"]
        }
    ]
}

7. 调试Docker中的Go程序

# 构建带调试信息的Docker镜像
docker build -t myapp-debug -f Dockerfile.debug .

# 运行并暴露调试端口
docker run -p 8080:8080 -p 2345:2345 myapp-debug

# 远程连接调试
dlv connect localhost:2345

8. 常见调试命令示例

package main

import (
    "fmt"
    "time"
)

func main() {
    var counter int
    ch := make(chan int)
    
    // 设置断点在这里
    go func() {
        for i := 0; i < 5; i++ {
            ch <- i
            time.Sleep(time.Second)
        }
        close(ch)
    }()
    
    for val := range ch {
        counter += val
        fmt.Printf("Received: %d, Total: %d\n", val, counter)
    }
}

使用Delve调试:

# 启动调试
dlv debug main.go

# 在main函数设置断点
(dlv) break main.main

# 在第20行设置断点
(dlv) break main.go:20

# 查看所有断点
(dlv) breakpoints

# 继续执行
(dlv) continue

# 当断点命中时,查看变量
(dlv) print counter
(dlv) print val

# 查看goroutine状态
(dlv) goroutines

9. 调试配置优化

对于macOS,可能需要设置:

# 允许Delve附加到进程
sudo /usr/sbin/DevToolsSecurity -enable

# 如果使用SIP系统,可能需要临时禁用
csrutil disable  # 重启后生效,调试完成后重新启用

Delve相比GDB在Go调试方面提供了更好的支持,特别是对于goroutine、channel和interface等Go特有特性的调试。如果STS/goclipse对Delve支持不完整,可以考虑使用命令行Delve或切换到对Go调试支持更好的IDE。

回到顶部