]> Cypherpunks repositories - gostls13.git/commit
runtime/trace: use regular unwinding for cgo callbacks
authorFelix Geisendörfer <felix.geisendoerfer@datadoghq.com>
Mon, 13 Mar 2023 09:18:36 +0000 (10:18 +0100)
committerMichael Pratt <mpratt@google.com>
Thu, 30 Mar 2023 19:18:12 +0000 (19:18 +0000)
commit3dd221a94d044cb4371ec20266817a703b2fe683
tree1b856a9afca3bcb5156985d76120de07e0f62aef
parentba71817390f78bf8c479dc65d1bc51db98d667a7
runtime/trace: use regular unwinding for cgo callbacks

Introduce a new m.incgocallback field that is true while C code calls
into Go code. Use it in the tracer in order to fallback to the default
unwinder instead of frame pointer unwinding for this scenario. The
existing fields (incgo, ncgo) were not sufficient to detect the case
where a thread created in C calls into Go code.

Motivation:

1. Take advantage of a cgo symbolizer, if registered, to unwind through
   C stacks without frame pointers.
2. Reduce the chance of crashes. It seems unsafe to follow frame
   pointers when there could be C code that was compiled without frame
   pointers.

Removing the curgp.m.incgocallback check in traceStackID shows the
following minor differences between frame pointer unwinding and the
default unwinder when there is no cgo symbolizer involved.

    trace_test.go:60: "goCalledFromCThread": got stack:
        main.goCalledFromCThread
         /src/runtime/testdata/testprogcgo/trace.go:58
        _cgoexp_45c15a3efb3a_goCalledFromCThread
         _cgo_gotypes.go:694
        runtime.cgocallbackg1
         /src/runtime/cgocall.go:318
        runtime.cgocallbackg
         /src/runtime/cgocall.go:236
        runtime.cgocallback
         /src/runtime/asm_amd64.s:998
        crosscall2
         /src/runtime/cgo/asm_amd64.s:30

        want stack:
        main.goCalledFromCThread
         /src/runtime/testdata/testprogcgo/trace.go:58
        _cgoexp_45c15a3efb3a_goCalledFromCThread
         _cgo_gotypes.go:694
        runtime.cgocallbackg1
         /src/runtime/cgocall.go:318
        runtime.cgocallbackg
         /src/runtime/cgocall.go:236
        runtime.cgocallback
         /src/runtime/asm_amd64.s:998

    trace_test.go:60: "goCalledFromC": got stack:
        main.goCalledFromC
         /src/runtime/testdata/testprogcgo/trace.go:51
        _cgoexp_45c15a3efb3a_goCalledFromC
         _cgo_gotypes.go:687
        runtime.cgocallbackg1
         /src/runtime/cgocall.go:318
        runtime.cgocallbackg
         /src/runtime/cgocall.go:236
        runtime.cgocallback
         /src/runtime/asm_amd64.s:998
        crosscall2
         /src/runtime/cgo/asm_amd64.s:30
        runtime.asmcgocall
         /src/runtime/asm_amd64.s:848
        main._Cfunc_cCalledFromGo
         _cgo_gotypes.go:263
        main.goCalledFromGo
         /src/runtime/testdata/testprogcgo/trace.go:46
        main.Trace
         /src/runtime/testdata/testprogcgo/trace.go:37
        main.main
         /src/runtime/testdata/testprogcgo/main.go:34

        want stack:
        main.goCalledFromC
         /src/runtime/testdata/testprogcgo/trace.go:51
        _cgoexp_45c15a3efb3a_goCalledFromC
         _cgo_gotypes.go:687
        runtime.cgocallbackg1
         /src/runtime/cgocall.go:318
        runtime.cgocallbackg
         /src/runtime/cgocall.go:236
        runtime.cgocallback
         /src/runtime/asm_amd64.s:998
        runtime.systemstack_switch
         /src/runtime/asm_amd64.s:463
        runtime.cgocall
         /src/runtime/cgocall.go:168
        main._Cfunc_cCalledFromGo
         _cgo_gotypes.go:263
        main.goCalledFromGo
         /src/runtime/testdata/testprogcgo/trace.go:46
        main.Trace
         /src/runtime/testdata/testprogcgo/trace.go:37
        main.main
         /src/runtime/testdata/testprogcgo/main.go:34

For #16638

Change-Id: I95fa27a3170c5abd923afc6eadab4eae777ced31
Reviewed-on: https://go-review.googlesource.com/c/go/+/474916
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Michael Pratt <mpratt@google.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Run-TryBot: Felix Geisendörfer <felix.geisendoerfer@datadoghq.com>
src/runtime/proc.go
src/runtime/testdata/testprogcgo/trace.go [new file with mode: 0644]
src/runtime/testdata/testprogcgo/trace_unix.c [new file with mode: 0644]
src/runtime/testdata/testprogcgo/trace_windows.c [new file with mode: 0644]
src/runtime/trace.go
src/runtime/trace_cgo_test.go [new file with mode: 0644]