# 编译时加入调试信息
go build -gcflags "-N -l" main.go
# 使用gdb调试
gdb ./main
# 安装Delve
go install github.com/go-delve/delve/cmd/dlv@latest
# 常用命令
dlv debug main.go # 启动调试
dlv exec ./main # 调试已编译程序
dlv attach <pid> # 附加到运行中的进程
# 调试命令
b main.main # 设置断点
c # 继续执行
n # 单步执行(不进入函数)
s # 单步执行(进入函数)
p variable # 打印变量值
bt # 查看调用栈
import "log"
func main() {
log.Println("常规日志")
log.Printf("格式化日志: %s", "value")
log.Fatal("致命错误,会退出程序")
}
# 常用日志库
go get -u go.uber.org/zap # Uber高性能日志库
go get -u github.com/sirupsen/logrus # 结构化日志
import "runtime/pprof"
func main() {
f, _ := os.Create("cpu.prof")
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()
// 你的代码
}
import "runtime/pprof"
func main() {
f, _ := os.Create("mem.prof")
defer pprof.WriteHeapProfile(f)
// 你的代码
}
go tool pprof cpu.prof # 分析CPU性能
go tool pprof mem.prof # 分析内存使用
# 常用pprof命令
top10 # 查看前10耗时函数
list Func # 查看函数详情
web # 生成可视化图表(需要graphviz)
GODEBUG=gctrace=1 ./main # 跟踪GC行为
GODEBUG=schedtrace=1000 ./main # 每1000ms输出调度信息
go build -race main.go # 编译时加入竞争检测
./main # 运行时会检测数据竞争
go test -v # 详细输出
go test -run TestFunc # 运行特定测试函数
go test -cover # 查看测试覆盖率
go test -coverprofile=cover.out && go tool cover -html=cover.out # 可视化覆盖率
import "runtime/debug"
func foo() {
debug.PrintStack() // 打印当前堆栈
}
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered:", r)
}
}()
panic("something went wrong")
}
go vet ./... # 检查常见错误
这些技巧可以帮助你在Linux环境下高效地调试Golang程序,根据具体问题选择合适的调试方法。