1.6 问题追踪和调试

Go语言所提供的是尽量简单的语法和尽量完善的库,以尽可能降低问题的发生概率。当然,问题还是会发生的,这时需要用到问题追踪和调试技能。这里我们简单介绍下两个最常规的问题跟踪方法:打印日志和使用GDB进行逐步调试。

1.6.1 打印日志

Go语言包中包含一个fmt包,其中提供了大量易用的打印函数,我们会接触到的主要是Printf()Println()。这两个函数可以满足我们的基本调试需求,比如临时打印某个变量。这两个函数的参数非常类似于C语言运行库中的Printf(),有C语言开发经验的同学会很容易上手。下面是几个使用Printf()Println()的例子:

fval := 110.48
ival := 200
sval := "This is a string. "
fmt.Println("The value of fval is", fval)
fmt.Printf("fval=%f, ival=%d, sval=%s\n", fval, ival, sval)
fmt.Printf("fval=%v, ival=%v, sval=%v\n", fval, ival, sval)

输出结果为:

The value of fval is 100.48
fval=100.48, ival=200, sval=This is a string.
fval=100.48, ival=200, sval=This is a string.

fmt包的这一系列格式化打印函数使用起来非常方便,但在正式开始用Go开发服务器系统时,我们就不能只依赖fmt包了,而是需要设计严格的日志规范。Go语言的log包提供了基础的日志功能。如果有需要,你也可以引入自己的log模块。

1.6.2 GDB调试

不用设置什么编译选项,Go语言编译的二进制程序直接支持GDB调试,比如之前用go build calc编译出来的可执行文件calc,就可以直接用以下命令以调试模式运行:

$ gdb calc

因为GDB的标准用法与Go没有特别关联,这里就不详细展开了,有兴趣的读者可以自行查看对应的文档。需要注意的是,Go编译器生成的调试信息格式为DWARFv3,只要版本高于7.1的GDB应该都支持它。

目录