面试题答案
一键面试log
包- 使用方法:在代码中合适的位置(例如可能引发
panic
的函数调用附近)使用log.Println
等函数记录相关信息。当panic
发生时,可以通过查看日志了解程序执行到该位置时的状态,如变量的值等。例如:
- 使用方法:在代码中合适的位置(例如可能引发
package main
import (
"log"
)
func main() {
var num int
log.Println("Before division")
result := 10 / num
log.Println("After division")
}
在上述代码中,log.Println("Before division")
可以让我们知道程序执行到了除法运算之前,若发生panic
,可以结合日志定位问题。
debug
包下的stack
- 使用方法:在
defer
语句中调用debug.Stack()
函数。当panic
发生时,defer
语句会被执行,debug.Stack()
会输出当前的堆栈跟踪信息,帮助我们了解函数调用链,从而确定panic
发生的具体位置。示例如下:
- 使用方法:在
package main
import (
"debug/stack"
"fmt"
)
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered from panic:", r)
stack.Print()
}
}()
var num int
result := 10 / num
}
当程序因除零操作发生panic
时,debug.Stack()
输出的堆栈信息能展示从main
函数开始到发生panic
的函数调用路径。
pprof
- 使用方法:在程序中导入
net/http
和runtime/pprof
包,并启动一个HTTP服务器来提供pprof
相关的端点。例如:
- 使用方法:在程序中导入
package main
import (
"log"
"net/http"
_ "net/http/pprof"
)
func main() {
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
// 模拟业务逻辑,可能会引发panic
var num int
result := 10 / num
}
当panic
发生后,可以通过浏览器访问http://localhost:6060/debug/pprof/
等端点,使用pprof
工具(如go tool pprof
)分析收集到的性能和堆栈信息,从而找到panic
的根源。pprof
可以提供关于CPU使用、内存分配以及函数调用关系等方面的详细数据,辅助定位panic
相关问题。