aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFelix Geisendörfer <felix.geisendoerfer@datadoghq.com>2023-04-01 20:19:37 -0400
committerMichael Knyszek <mknyszek@google.com>2023-04-04 20:44:45 +0000
commit6991f63d9e97b2a76f29170450f40b5ac6bb87f3 (patch)
tree97fa44bd001eb7733295370a5856776b486b6211 /src
parent6d2cac12dbbd0e2f349106f1e4990b2feb0dda40 (diff)
downloadgo-6991f63d9e97b2a76f29170450f40b5ac6bb87f3.tar.xz
runtime/trace: Fix TestTraceSymbolize on solaris and illumos
Fix a regression caused by CL 463835. Unlike most platforms, solaris and illumos don't use a libc_read_trampoline, so we need to skip one frame less when using frame pointer unwinding in traceGoSysCall. The solution is a bit hacky, so it might make sense to implement gp.syscallbp if this causes more test failures in the future. Fixes #59350 Change-Id: I0f0b08f36efe8a492eb4a535e752c03636857057 Reviewed-on: https://go-review.googlesource.com/c/go/+/481336 TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Michael Knyszek <mknyszek@google.com> Run-TryBot: Felix Geisendörfer <felix.geisendoerfer@datadoghq.com> Reviewed-by: Michael Pratt <mpratt@google.com>
Diffstat (limited to 'src')
-rw-r--r--src/runtime/trace.go25
1 files changed, 16 insertions, 9 deletions
diff --git a/src/runtime/trace.go b/src/runtime/trace.go
index 81093cc9b9..d174ee2e4a 100644
--- a/src/runtime/trace.go
+++ b/src/runtime/trace.go
@@ -1553,16 +1553,23 @@ func traceGoUnpark(gp *g, skip int) {
}
func traceGoSysCall() {
- if tracefpunwindoff() {
- traceEvent(traceEvGoSysCall, 1)
- } else {
- // The default unwinder starts unwinding from gp.syscallsp
- // which is captured 3 frames above this frame. We could
- // capture gp.syscallbp to allow frame pointer unwinding to
- // behave the same, but skipping 3 more frames here is
- // simpler.
- traceEvent(traceEvGoSysCall, 4)
+ var skip int
+ switch {
+ case tracefpunwindoff():
+ // Unwind by skipping 1 frame relative to gp.syscallsp which is captured 3
+ // frames above this frame. For frame pointer unwinding we produce the same
+ // results by hard coding the number of frames in between our caller and the
+ // actual syscall, see cases below.
+ // TODO(felixge): Implement gp.syscallbp to avoid this workaround?
+ skip = 1
+ case GOOS == "solaris" || GOOS == "illumos":
+ // These platforms don't use a libc_read_trampoline.
+ skip = 3
+ default:
+ // Skip the extra trampoline frame used on most systems.
+ skip = 4
}
+ traceEvent(traceEvGoSysCall, skip)
}
func traceGoSysExit(ts int64) {