Golang中使用Dlv时如何关闭优化选项

Golang中使用Dlv时如何关闭优化选项 我正在尝试调用Go调试器dlv,以便相关可执行文件不被优化,但至今没有成功。以下是我的操作步骤:

我正在开发一个包含多个Go源代码文件的项目,这些文件分布在多个目录中。我首先进入包含main()函数的Go文件所在目录,然后在该目录中执行:

 dlv debug --build-flags="-gcflags='-N -l'" . -- <options>

其中<options>代表运行我的应用程序所需的参数。

执行此命令后,dlv会挂起一段时间,显然是在构建可执行文件。完成后,我会进入dlv命令行界面。我可以正常启动应用程序,并且它能够按预期运行。

现在,当在某个函数(任意函数)设置断点后,进入该函数时dlv会显示(除其他信息外):

Warning: debugging optimized function

我尝试了上述dlv命令的多种变体(例如移除等号等),但都没有效果。我的代码是通过Makefile构建的,但据我了解dlv会忽略makefile。无论如何,我尝试修改Makefile以构建无优化版本,但就dlv而言仍然没有成功。所有这些操作都是在Linux下的Go 1.9.2版本中进行的。

对于接下来该如何进行有什么建议吗?


更多关于Golang中使用Dlv时如何关闭优化选项的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

更多信息:我将上述命令行修改为:

dlv debug --build-flags="-v -x -gcflags '-N -l'" . -- <options>

通过这个命令,我获得了大量关于dlv正在执行的操作输出。我特别关注以下几行:

mkdir -p $WORK/github.com/mymodule/analysis/_obj/
cd /home/abc/Go/src/github.com/mymodule/_gobuild/src/github.com/mymodule/analysis /usr/lib64/go1.9.2/go/pkg/tool/linux_amd64/compile -o $WORK/github.com/mymodule/analysis.a -trimpath $WORK -N -l -goversion go1.9.2 -p github.com/mymodule/analysis -complete -buildid 1b090ebb89235c0e56797d254c53089896e1d9bc -importmap github.com/Sirupsen/logrus=vendor/github.com/Sirupsen/logrus -importmap github.com/golang-collections/go-datastructures/queue=vendor/github.com/golang-collections/go-datastructures/queue -importmap github.com/miekg/dns=vendor/github.com/miekg/dns -importmap golang.org/x/net/idna=vendor/golang.org/x/net/idna -D _/home/abc/Go/src/github.com/mymodule/_gobuild/src/github.com/mymodule/analysis -I $WORK -I /home/abc/Go/src/github.com/mymodule/_gobuild/pkg/linux_amd64 -pack ./s1.go ./s2.go ./s3.go ./s4.go ./s5.go ./s6.go ./s7.go

我的代码位于s1.go到s7.go文件中。看起来这段代码确实是用-N -l参数构建的,意味着没有进行优化或内联。然而,当在这些Go文件中定义的任何函数处设置断点时,dlv仍然警告我该函数已被优化——实际上确实如此,因为尝试单步执行时无法正常工作,这与优化代码的情况一致。

这个论坛里是否有dlv专家能够解释一下这里到底发生了什么?

更多关于Golang中使用Dlv时如何关闭优化选项的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在 Go 中使用 Delve (dlv) 调试器时,关闭优化选项的关键在于正确传递 -gcflags 参数。您遇到的问题通常是由于参数传递方式不正确导致的。以下是正确的做法:

解决方案

使用以下命令格式来禁用优化:

dlv debug --build-flags="-gcflags='all=-N -l'" .

或者更明确地指定:

dlv debug --build-flags="-gcflags=all=-N -l" .

关键点说明

  1. 添加 all= 前缀:这是最重要的修改。all= 确保优化禁用应用于所有包,包括标准库和依赖项。

  2. 参数格式:等号和引号的使用需要正确:

    # 正确格式
    dlv debug --build-flags="-gcflags=all=-N -l" -- <your-options>
    
    # 或者使用引号
    dlv debug --build-flags="-gcflags='all=-N -l'" -- <your-options>
    

验证优化是否已禁用

在调试会话中,您可以通过以下方式验证:

(dlv) break main.main
(dlv) continue

当命中断点时,不应该再看到 “Warning: debugging optimized function” 的警告信息。

替代方法

如果上述方法仍然无效,可以尝试先构建未优化的二进制文件,然后使用 dlv 附加:

# 构建未优化的可执行文件
go build -gcflags="all=-N -l" -o myapp

# 使用 dlv 执行
dlv exec ./myapp -- <options>

调试示例

package main

import "fmt"

func debugMe() {
    x := 42
    y := x * 2 // 在此行设置断点
    fmt.Println(y)
}

func main() {
    debugMe()
}

使用正确命令调试:

dlv debug --build-flags="-gcflags=all=-N -l" .
(dlv) break main.debugMe:4
(dlv) continue

这样应该能够正常调试而不出现优化警告。

回到顶部