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
在 Go 中使用 Delve (dlv) 调试器时,关闭优化选项的关键在于正确传递 -gcflags 参数。您遇到的问题通常是由于参数传递方式不正确导致的。以下是正确的做法:
解决方案
使用以下命令格式来禁用优化:
dlv debug --build-flags="-gcflags='all=-N -l'" .
或者更明确地指定:
dlv debug --build-flags="-gcflags=all=-N -l" .
关键点说明
-
添加
all=前缀:这是最重要的修改。all=确保优化禁用应用于所有包,包括标准库和依赖项。 -
参数格式:等号和引号的使用需要正确:
# 正确格式 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
这样应该能够正常调试而不出现优化警告。


