调试技巧
使用Delve调试器
Go语言的调试工具。
# 安装Delve
go get github.com/go-delve/delve/cmd/dlv
# 启动调试
dlv debug main.go
# 常用命令
break main.main # 设置断点
continue # 继续执行
next # 下一步
step # 步入
print var # 打印变量
stack # 显示调用栈
goroutines # 显示所有goroutine
vars # 显示所有变量
regs # 显示寄存器
trace # 设置跟踪点
# 条件断点
break main.main if i > 10
# 查看源代码
list # 显示当前行
list main.main # 显示指定函数
list 10 # 显示指定行
日志调试
使用日志进行调试。
package main
import (
"log"
"os"
)
func main() {
// 配置日志
logFile, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
log.Fatal(err)
}
defer logFile.Close()
// 设置日志输出
log.SetOutput(logFile)
log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
// 记录日志
log.Println("程序启动")
log.Printf("处理请求: %s", "GET /api/users")
// 错误日志
if err := processRequest(); err != nil {
log.Printf("错误: %v", err)
}
}
性能分析
使用pprof进行性能分析。
package main
import (
"net/http"
_ "net/http/pprof"
"runtime/pprof"
"os"
)
func main() {
// 启动pprof服务器
go func() {
http.ListenAndServe("localhost:6060", nil)
}()
// CPU分析
f, err := os.Create("cpu.prof")
if err != nil {
log.Fatal(err)
}
defer f.Close()
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()
// 内存分析
f, err = os.Create("mem.prof")
if err != nil {
log.Fatal(err)
}
defer f.Close()
pprof.WriteHeapProfile(f)
// 运行程序
runApplication()
}
竞态检测
使用Go的竞态检测器。
# 运行竞态检测
go run -race main.go
# 测试竞态检测
go test -race ./...
# 示例代码
package main
import (
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
var counter int
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
counter++ // 这里会有竞态
}()
}
wg.Wait()
println(counter)
}
调试技巧
常用的调试技巧和最佳实践。
# 1. 使用fmt.Printf进行简单调试
fmt.Printf("变量值: %+v\n", variable)
# 2. 使用runtime/debug打印堆栈
import "runtime/debug"
debug.PrintStack()
# 3. 使用panic和recover
func safeOperation() {
defer func() {
if r := recover(); r != nil {
fmt.Printf("恢复panic: %v\n", r)
debug.PrintStack()
}
}()
// 可能panic的操作
}
# 4. 使用条件编译
// +build debug
package main
func init() {
// 调试模式下的初始化
}
# 5. 使用环境变量控制调试
if os.Getenv("DEBUG") == "1" {
// 调试代码
}