调试技巧

使用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" {
    // 调试代码
}