MST

星途 面试题库

面试题:Go调度器调试之基础问题

在Go调度器调试时,常用的获取当前运行goroutine信息的方法有哪些?请列举并简要说明其用途。
18.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. runtime.Stack函数
    • 用途:可以获取当前goroutine的栈跟踪信息。它将栈信息写入到一个字节切片中,常用于调试时查看当前goroutine的执行状态,比如函数调用栈的层级结构,便于定位程序在何处出现死锁、阻塞等问题。例如:
    var buf [4096]byte
    n := runtime.Stack(buf[:], false)
    fmt.Printf("当前goroutine栈信息:\n%s", buf[:n])
    
    其中第二个参数false表示不获取所有goroutine的栈信息,只获取当前goroutine的栈信息。如果为true,则获取所有goroutine的栈信息。
  2. runtime.Caller函数
    • 用途:用于获取当前goroutine调用栈中指定深度的函数调用信息,包括函数所在的文件名、行号以及函数名等。可以通过多次调用runtime.Caller并递增深度值,从而逐步获取调用栈的各级信息,有助于分析函数调用链路,理解程序的执行流程。例如:
    _, file, line, _ := runtime.Caller(1)
    fmt.Printf("当前函数在文件 %s 的第 %d 行被调用\n", file, line)
    
    这里深度值为1表示获取调用当前函数的外层函数信息,深度值为0获取的是runtime.Caller自身调用处的信息,一般使用1及以上来获取实际业务代码调用信息。
  3. runtime.GoroutineProfile函数
    • 用途:收集当前运行的goroutine的概要信息,这些信息可以用于分析goroutine的创建、销毁以及生命周期等情况。通过runtime.GoroutineProfile收集的信息可以进一步通过pprof工具进行可视化展示和深入分析,有助于全面了解程序中goroutine的行为模式,发现潜在的性能问题或资源管理不当的地方。例如:
    var buf bytes.Buffer
    if err := runtime.GoroutineProfile(&buf); err != nil {
        log.Fatal(err)
    }
    
    收集的信息存储在buf中,后续可以通过pprof相关接口进一步处理。