dlv attach进程触发panic: <nil> not an Int问题求助
Delve attach PID 1 触发 panic 问题排查与解决
问题现象
执行dlv attach 1时触发panic,报错栈信息如下:
dlv attach 1 panic: <nil> not an Int goroutine 1 [running]: go/constant.Int64Val(0x0, 0x0, 0xc, 0xc0074ff300) /usr/local/go/src/go/constant/value.go:499 +0x19d github.com/go-delve/delve/pkg/proc.(*Variable).parseG.func1(0xba0c52, 0xc, 0x9) /home/go/src/delve/pkg/proc/variables.go:822 +0x6b github.com/go-delve/delve/pkg/proc.(*Variable).parseG(0xc0074fe200, 0xc000244000, 0xc0074fe200, 0x0) /home/go/src/delve/pkg/proc/variables.go:846 +0x44b github.com/go-delve/delve/pkg/proc.GetG(0xcb1b60, 0xc000244000, 0xc000244000, 0x7fb53c4fe2a8, 0xc000228580) /home/go/src/delve/pkg/proc/variables.go:247 +0xd1 github.com/go-delve/delve/pkg/proc.NewTarget(0xcb4760, 0xc000228580, 0xc000051840, 0x1a, 0xc000212420, 0x1, 0x1, 0xc00016e520, 0x200, 0xc0001cb6b8, ...) /home/go/src/delve/pkg/proc/target.go:128 +0x22d github.com/go-delve/delve/pkg/proc/native.(*nativeProcess).initialize(0xc000228580, 0xc000051840, 0x1a, 0xc000212420, 0x1, 0x1, 0x0, 0xc0002688c0, 0x10000c0001cb750) /home/go/src/delve/pkg/proc/native/proc.go:305 +0x19e github.com/go-delve/delve/pkg/proc/native.Attach(0x1, 0xc000212420, 0x1, 0x1, 0xc0001cb898, 0xc0001cb7a0, 0x40bb0b) /home/go/src/delve/pkg/proc/native/proc_linux.go:132 +0x1bb github.com/go-delve/delve/service/debugger.(*Debugger).Attach(0xc0002146c0, 0x1, 0x0, 0x0, 0xc0001cb858, 0x1, 0x1) /home/go/src/delve/service/debugger/debugger.go:295 +0x216 github.com/go-delve/delve/service/debugger.New(0xc0002687e0, 0xc000212560, 0x0, 0x0, 0x0, 0x0, 0x0) /home/go/src/delve/service/debugger/debugger.go:121 +0x7cd github.com/go-delve/delve/service/rpccommon.(*ServerImpl).Run(0xc000214600, 0xc000214600, 0xc00024e5a0) /home/go/src/delve/service/rpccommon/server.go:112 +0xc8 github.com/go-delve/delve/cmd/dlv/cmds.execute(0x1, 0xc000212560, 0x0, 0x0, 0xc000245f80, 0x0, 0x0, 0x3, 0x0) /home/go/src/delve/cmd/dlv/cmds/commands.go:774 +0x501 github.com/go-delve/delve/cmd/dlv/cmds.attachCmd(0xc000238900, 0xc000212560, 0x1, 0x1) /home/go/src/delve/cmd/dlv/cmds/commands.go:606 +0xc0 github.com/spf13/cobra.(*Command).execute(0xc000238900, 0xc000212510, 0x1, 0x1, 0xc000238900, 0xc000212510) /home/go/pkg/mod/github.com/spf13/cobra@v0.0.0-20170417170307-b6cb39589372/command.go:647 +0x231 github.com/spf13/cobra.(*Command).ExecuteC(0xc0002386c0, 0xc0002386c0, 0xb99853, 0x6) /home/go/pkg/mod/github.com/spf13/cobra@v0.0.0-20170417170307-b6cb39589372/command.go:733 +0x2bc github.com/spf13/cobra.(*Command).Execute(...) /home/go/pkg/mod/github.com/spf13/cobra@v0.0.0-20170417170307-b6cb39589372/command.go:692 main.main() /home/go/src/delve/cmd/dlv/main.go:24 +0xc6
当前环境信息:
- Go版本:1.14.1
- Delve版本:1.4.0
- 安装步骤:
- 下载并解压Go 1.14.1到
/usr/local - 创建GOPATH目录
/home/go/bin、/home/go/pkg、/home/go/src并配置环境变量 - 克隆
derekparker/delve仓库,进入delve/cmd/dlv执行go build和go install
- 下载并解压Go 1.14.1到
解决方案
1. 升级Delve版本
Delve 1.4.0存在已知的attach进程相关bug,建议升级到更高稳定版本:
# 移除旧源码 rm -rf $GOPATH/src/github.com/go-delve/delve # 克隆官方最新仓库(原仓库已迁移到go-delve/delve) git clone https://github.com/go-delve/delve.git $GOPATH/src/github.com/go-delve/delve # 编译安装 cd $GOPATH/src/github.com/go-delve/delve/cmd/dlv go install # 验证版本 dlv version
2. 避免attach非Go进程
PID 1是系统初始化进程(init/systemd),并非Go编写的进程。Delve是Go专属调试器,无法正常attach非Go进程,这是触发panic的核心原因。请确保attach的目标是Go编译生成的进程。
3. 检查版本兼容性
Go 1.14.x建议搭配Delve 1.6.x及以上版本,避免版本不匹配导致的变量解析错误。编译Delve时必须使用当前环境的Go版本,禁止混用不同版本的Go。
4. 以root权限执行attach
部分进程需要root权限才能被调试,执行命令时添加sudo:
sudo dlv attach <目标Go进程PID>
内容的提问来源于stack exchange,提问作者fio
相关产品推荐
相关产品推荐

