Go问答 关于 groutine 唤醒中 skipframes 参数不理解

spf · 2020年11月03日 · 最后由 spf 回复于 2020年11月10日 · 1213 次阅读
本帖已被设为精华帖!
// SemacquireMutex is like Semacquire, but for profiling contended Mutexes.
// If lifo is true, queue waiter at the head of wait queue.
// skipframes is the number of frames to omit during tracing, counting from
// runtime_SemacquireMutex's caller.
func runtime_SemacquireMutex(s *uint32, lifo bool, skipframes int)

这个 skipframes 代表的是什么意思? go1.14 在 RWMutex 的逻辑中只有 Runlock 时为 1,其他时候都是 0 是什么原理?

更多原创文章干货分享,请关注公众号
  • 加微信实战群请加微信(注明:实战群):gocnio

表示的是卡在这里的 goroutine, 你看到 (比如在 pprof 的 goroutine 页面) 的时候,有些 runtime 里的栈要不要展示 你可以自己观察一下,有些 runtime 里的函数中间调用栈是不展示的

cch123 回复

我问题没说明白。这个函数的作用是阻塞该 groutine,但是我想知道的是 skipframes 这个参数是什么作用,注释字面意思"trace 追踪时忽略的帧数"这个不理解。比如填 10 和填 0 有什么区别

spf 回复
(dlv) bt
0  0x0000000001047ee3 in runtime.semacquire1
   at ./sdk/go1.14.2/src/runtime/sema.go:98
1  0x0000000001047d02 in internal/poll.runtime_Semacquire
   at ./sdk/go1.14.2/src/runtime/sema.go:61
2  0x000000000108b805 in internal/poll.(*FD).Close
   at ./sdk/go1.14.2/src/internal/poll/fd_unix.go:109
3  0x0000000001091bd4 in os.(*file).close
   at ./sdk/go1.14.2/src/os/file_unix.go:248
4  0x0000000001091afb in os.(*File).Close
   at ./sdk/go1.14.2/src/os/file_unix.go:237
5  0x00000000010ac8b3 in os/exec.(*Cmd).writerDescriptor.func1
   at ./sdk/go1.14.2/src/os/exec/exec.go:312
6  0x00000000010ac917 in os/exec.(*Cmd).Start.func1
   at ./sdk/go1.14.2/src/os/exec/exec.go:441
7  0x00000000010663e1 in runtime.goexit
   at ./sdk/go1.14.2/src/runtime/asm_amd64.s:1373

实际的栈长上面这样,skipframe = 几就跳几层不展示呗

cch123 回复

好像明白了 可以把你这段测试代码和 dlv 调试命令贴一下吗,多谢

spf 回复

代码随意。。随便写个能锁阻塞住的代码就可以

在 semacquire1 上打断点

cch123 回复

好的 多谢了

cch123 回复

再请教下 作用知道了 但是这么做的目的是什么呢? 仅仅是为了 debug 时不打印栈信息?

spf 回复

为了看 stack 的时候 (进 pprof/goroutine?debug=1 看什么的) 方便吧, 要不然一堆中间调用看起来费劲

应该没什么深层次的原因

cch123 回复

ok 多谢哈

spf 关闭了讨论 11月10日 18:21
astaxie 将本帖设为了精华贴 11月11日 12:26
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册