使用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
更多关于使用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中:
- 右键项目 → Debug As → Debug Configurations
- 创建新的Go Debug配置
- 设置调试器类型为"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:
- 打开Preferences → Go → Debugger
- 选择"Delve"作为调试后端
- 配置Delve路径:
$GOPATH/bin/dlv - 设置调试参数:
--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。

