diff options
| author | doujiang24 <doujiang24@gmail.com> | 2022-08-12 02:28:43 +0000 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2022-08-12 18:26:31 +0000 |
| commit | ea9c3fd42d94182ce6f87104b68a51ea92f1a571 (patch) | |
| tree | 69fc24984a0e72e657d99f4c69b83cd7b53309f6 /src/runtime/trace.go | |
| parent | b6f87b0755f9705ce7d1c11c1b5354e8400ca7aa (diff) | |
| download | go-ea9c3fd42d94182ce6f87104b68a51ea92f1a571.tar.xz | |
runtime/trace: add missing events for the locked g in extra M.
Extra Ms may lead to the "no consistent ordering of events possible" error when parsing trace file with cgo enabled, since:
1. The gs in the extra Ms may be in `_Gdead` status while starting trace by invoking `runtime.StartTrace`,
2. and these gs will trigger `traceEvGoSysExit` events in `runtime.exitsyscall` when invoking go functions from c,
3. then, the events of those gs are under non-consistent ordering, due to missing the previous events.
Add two events, `traceEvGoCreate` and `traceEvGoInSyscall`, in `runtime.StartTrace`, will make the trace parser happy.
Fixes #29707
Change-Id: I7cc4b80822d2c46591304a59c9da2c9fc470f1d0
GitHub-Last-Rev: 445de8eaf3fb54e12795ac31e26650f821c5efbc
GitHub-Pull-Request: golang/go#53284
Reviewed-on: https://go-review.googlesource.com/c/go/+/411034
Run-TryBot: Michael Pratt <mpratt@google.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Auto-Submit: Michael Pratt <mpratt@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Michael Pratt <mpratt@google.com>
Diffstat (limited to 'src/runtime/trace.go')
| -rw-r--r-- | src/runtime/trace.go | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/src/runtime/trace.go b/src/runtime/trace.go index 1b5e9df38b..d0921eeaa8 100644 --- a/src/runtime/trace.go +++ b/src/runtime/trace.go @@ -272,6 +272,17 @@ func StartTrace() error { if status == _Gsyscall { gp.traceseq++ traceEvent(traceEvGoInSyscall, -1, gp.goid) + } else if status == _Gdead && gp.m != nil && gp.m.isextra { + // trigger two trace events for the dead g in the extra m, + // since the next event of the g will be traceEvGoSysExit in exitsyscall, + // while calling from C thread to Go. + gp.traceseq = 0 + gp.tracelastp = getg().m.p + // +PCQuantum because traceFrameForPC expects return PCs and subtracts PCQuantum. + id := trace.stackTab.put([]uintptr{startPCforTrace(0) + sys.PCQuantum}) // no start pc + traceEvent(traceEvGoCreate, -1, gp.goid, uint64(id), stackID) + gp.traceseq++ + traceEvent(traceEvGoInSyscall, -1, gp.goid) } else { gp.sysblocktraced = false } @@ -1555,7 +1566,7 @@ func trace_userLog(id uint64, category, message string) { func startPCforTrace(pc uintptr) uintptr { f := findfunc(pc) if !f.valid() { - return pc // should not happen, but don't care + return pc // may happen for locked g in extra M since its pc is 0. } w := funcdata(f, _FUNCDATA_WrapInfo) if w == nil { |
