go: cmd/compile: nosplit stack overflow with -gcflags "all=-N -l" -race (darwin/arm64 | Goland debug cmd)
What version of Go are you using (go version
)?
$ go version go version go1.18.5 darwin/arm64
Does this issue reproduce with the latest release?
Yes (go 1.19)
$ go version go version go1.19 darwin/arm64
What operating system and processor architecture are you using (go env
)?
go env
Output
$ go env GO111MODULE="" GOARCH="arm64" GOBIN="" GOCACHE="/Users/ghostiam/Library/Caches/go-build" GOENV="/Users/ghostiam/Library/Application Support/go/env" GOEXE="" GOEXPERIMENT="" GOFLAGS="" GOHOSTARCH="arm64" GOHOSTOS="darwin" GOINSECURE="" GOMODCACHE="/Users/ghostiam/projects/golang/pkg/mod" GONOPROXY="" GONOSUMDB="" GOOS="darwin" GOPATH="/Users/ghostiam/projects/golang" GOPRIVATE="" GOPROXY="http://localhost:8123" GOROOT="/Users/ghostiam/projects/golang/sdk/go1.19" GOSUMDB="sum.golang.org" GOTMPDIR="" GOTOOLDIR="/Users/ghostiam/projects/golang/sdk/go1.19/pkg/tool/darwin_arm64" GOVCS="" GOVERSION="go1.19" GCCGO="gccgo" AR="ar" CC="clang" CXX="clang++" CGO_ENABLED="1" GOMOD="/Users/ghostiam/Desktop/test/go.mod" GOWORK="" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS="-g -O2" CGO_FFLAGS="-g -O2" CGO_LDFLAGS="-g -O2" PKG_CONFIG="pkg-config" GOGCCFLAGS="-fPIC -arch arm64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/pc/st46ghc9375gx_q1ktbvpq900000gn/T/go-build1017110940=/tmp/go-build -gno-record-gcc-switches -fno-common"
What did you do?
go build -gcflags "all=-N -l" -race -v
2 lines of code: https://go.dev/play/p/v-LC84qDHo4
package main
import (
"os/exec"
)
func main() {
cmd := exec.Command("echo", "test")
_ = cmd.Start()
}
What did you expect to see?
Successful build and debug
What did you see instead?
go 1.18.5 Output
$ go build -gcflags "all=-N -l" -race -v test # test runtime.fatalthrow: nosplit stack overflow 792 assumed on entry to syscall.ptrace<1> (nosplit) 664 after syscall.ptrace<1> (nosplit) uses 128 456 after syscall.ptrace1<1> (nosplit) uses 208 264 after syscall.syscall6<1> (nosplit) uses 192 232 after runtime.entersyscall<1> (nosplit) uses 32 168 after runtime.reentersyscall<1> (nosplit) uses 64 136 after runtime.save<1> (nosplit) uses 32 104 after runtime.badctxt<1> (nosplit) uses 32 56 after runtime.throw<1> (nosplit) uses 48 -8 after runtime.fatalthrow<1> (nosplit) uses 64
go 1.19 Output
$ go build -gcflags "all=-N -l" -race -v unicode/utf8 math/bits internal/itoa internal/unsafeheader internal/goos internal/goarch unicode internal/goexperiment runtime/internal/math runtime/internal/sys internal/abi sync/atomic internal/cpu math runtime/internal/atomic internal/bytealg runtime internal/reflectlite internal/race sync internal/testlog errors sort internal/oserror path io strconv syscall bytes strings internal/syscall/execenv internal/syscall/unix time runtime/cgo context io/fs internal/poll os internal/godebug path/filepath os/exec runtime/race test # test syscall.ptrace: nosplit stack over 792 byte limit syscall.ptrace<1> grows 128 bytes, calls syscall.ptrace1<1> grows 208 bytes, calls syscall.syscall6<1> grows 192 bytes, calls runtime.entersyscall<1> grows 32 bytes, calls runtime.reentersyscall<1> grows 64 bytes, calls runtime.save<1> grows 32 bytes, calls runtime.badctxt<1> grows 32 bytes, calls runtime.throw<1> grows 48 bytes, calls runtime.fatalthrow<1> grows 64 bytes, calls runtime.systemstack<0> grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 24 bytes over limit grows 16 bytes, calls runtime.abort<0> 24 bytes over limit grows 16 bytes, calls gosave_systemstack_switch<21> grows 0 bytes, calls runtime.abort<0> 24 bytes over limit grows 16 bytes, calls runtime.save_g<0> 24 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 24 bytes over limit grows 16 bytes, calls runtime.save_g<0> 24 bytes over limit grows 64 bytes, calls runtime.casgstatus<1> grows 80 bytes, calls runtime.nanotime<1> grows 32 bytes, calls runtime.nanotime1<0> grows 48 bytes, calls runtime.libcCall<1> grows 64 bytes, calls runtime.(*guintptr).set<1> 56 bytes over limit grows 64 bytes, calls runtime.asmcgocall<0> grows 16 bytes, calls gosave_systemstack_switch<21> grows 0 bytes, calls runtime.abort<0> 72 bytes over limit grows 16 bytes, calls runtime.save_g<0> 72 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 72 bytes over limit grows 16 bytes, calls runtime.save_g<0> 72 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 72 bytes over limit grows 80 bytes, calls runtime.nanotime<1> grows 32 bytes, calls runtime.nanotime1<0> grows 48 bytes, calls runtime.libcCall<1> grows 64 bytes, calls runtime.(*guintptr).set<1> 56 bytes over limit grows 64 bytes, calls runtime.asmcgocall<0> grows 16 bytes, calls gosave_systemstack_switch<21> grows 0 bytes, calls runtime.abort<0> 72 bytes over limit grows 16 bytes, calls runtime.save_g<0> 72 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 72 bytes over limit grows 16 bytes, calls runtime.save_g<0> 72 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 72 bytes over limit grows 80 bytes, calls runtime.osyield<1> grows 32 bytes, calls runtime.usleep<0> grows 32 bytes, calls runtime.libcCall<1> grows 64 bytes, calls runtime.(*guintptr).set<1> 40 bytes over limit grows 64 bytes, calls runtime.asmcgocall<0> grows 16 bytes, calls gosave_systemstack_switch<21> grows 0 bytes, calls runtime.abort<0> 56 bytes over limit grows 16 bytes, calls runtime.save_g<0> 56 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 56 bytes over limit grows 16 bytes, calls runtime.save_g<0> 56 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 56 bytes over limit grows 80 bytes, calls runtime.nanotime<1> grows 32 bytes, calls runtime.nanotime1<0> grows 48 bytes, calls runtime.libcCall<1> grows 64 bytes, calls runtime.(*guintptr).set<1> 56 bytes over limit grows 64 bytes, calls runtime.asmcgocall<0> grows 16 bytes, calls gosave_systemstack_switch<21> grows 0 bytes, calls runtime.abort<0> 72 bytes over limit grows 16 bytes, calls runtime.save_g<0> 72 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 72 bytes over limit grows 16 bytes, calls runtime.save_g<0> 72 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 72 bytes over limit grows 80 bytes, calls runtime.nanotime<1> grows 32 bytes, calls runtime.nanotime1<0> grows 48 bytes, calls runtime.libcCall<1> grows 64 bytes, calls runtime.(*guintptr).set<1> 56 bytes over limit grows 64 bytes, calls runtime.asmcgocall<0> grows 16 bytes, calls gosave_systemstack_switch<21> grows 0 bytes, calls runtime.abort<0> 72 bytes over limit grows 16 bytes, calls runtime.save_g<0> 72 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 72 bytes over limit grows 16 bytes, calls runtime.save_g<0> 72 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 72 bytes over limit grows 80 bytes, calls runtime.nanotime<1> grows 32 bytes, calls runtime.nanotime1<0> grows 48 bytes, calls runtime.libcCall<1> grows 64 bytes, calls runtime.(*guintptr).set<1> 56 bytes over limit grows 64 bytes, calls runtime.asmcgocall<0> grows 16 bytes, calls gosave_systemstack_switch<21> grows 0 bytes, calls runtime.abort<0> 72 bytes over limit grows 16 bytes, calls runtime.save_g<0> 72 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 72 bytes over limit grows 16 bytes, calls runtime.save_g<0> 72 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 72 bytes over limit grows 80 bytes, calls runtime.throw<1> grows 48 bytes, calls runtime.fatalthrow<1> grows 64 bytes, calls runtime.systemstack<0> grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 40 bytes over limit grows 16 bytes, calls runtime.abort<0> 40 bytes over limit grows 16 bytes, calls gosave_systemstack_switch<21> grows 0 bytes, calls runtime.abort<0> 40 bytes over limit grows 16 bytes, calls runtime.save_g<0> 40 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 40 bytes over limit grows 16 bytes, calls runtime.save_g<0> 40 bytes over limit grows 64 bytes, calls runtime.save<1> grows 32 bytes, calls runtime.badctxt<1> grows 32 bytes, calls runtime.throw<1> grows 48 bytes, calls runtime.fatalthrow<1> grows 64 bytes, calls runtime.systemstack<0> grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 24 bytes over limit grows 16 bytes, calls runtime.abort<0> 24 bytes over limit grows 16 bytes, calls gosave_systemstack_switch<21> grows 0 bytes, calls runtime.abort<0> 24 bytes over limit grows 16 bytes, calls runtime.save_g<0> 24 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 24 bytes over limit grows 16 bytes, calls runtime.save_g<0> 24 bytes over limit grows 64 bytes, calls runtime.save<1> grows 32 bytes, calls runtime.badctxt<1> grows 32 bytes, calls runtime.throw<1> grows 48 bytes, calls runtime.fatalthrow<1> grows 64 bytes, calls runtime.systemstack<0> grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 24 bytes over limit grows 16 bytes, calls runtime.abort<0> 24 bytes over limit grows 16 bytes, calls gosave_systemstack_switch<21> grows 0 bytes, calls runtime.abort<0> 24 bytes over limit grows 16 bytes, calls runtime.save_g<0> 24 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 24 bytes over limit grows 16 bytes, calls runtime.save_g<0> 24 bytes over limit grows 64 bytes, calls runtime.save<1> grows 32 bytes, calls runtime.badctxt<1> grows 32 bytes, calls runtime.throw<1> grows 48 bytes, calls runtime.fatalthrow<1> grows 64 bytes, calls runtime.systemstack<0> grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 24 bytes over limit grows 16 bytes, calls runtime.abort<0> 24 bytes over limit grows 16 bytes, calls gosave_systemstack_switch<21> grows 0 bytes, calls runtime.abort<0> 24 bytes over limit grows 16 bytes, calls runtime.save_g<0> 24 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 24 bytes over limit grows 16 bytes, calls runtime.save_g<0> 24 bytes over limit grows 64 bytes, calls runtime.save<1> grows 32 bytes, calls runtime.badctxt<1> grows 32 bytes, calls runtime.throw<1> grows 48 bytes, calls runtime.fatalthrow<1> grows 64 bytes, calls runtime.systemstack<0> grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 24 bytes over limit grows 16 bytes, calls runtime.abort<0> 24 bytes over limit grows 16 bytes, calls gosave_systemstack_switch<21> grows 0 bytes, calls runtime.abort<0> 24 bytes over limit grows 16 bytes, calls runtime.save_g<0> 24 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 24 bytes over limit grows 16 bytes, calls runtime.save_g<0> 24 bytes over limit grows 192 bytes, calls runtime.exitsyscall<1> grows 64 bytes, calls runtime.exitsyscallfast<1> grows 80 bytes, calls runtime.wirep<1> grows 64 bytes, calls runtime.throw<1> grows 48 bytes, calls runtime.systemstack<0> grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 8 bytes over limit grows 16 bytes, calls runtime.abort<0> 8 bytes over limit grows 16 bytes, calls gosave_systemstack_switch<21> grows 0 bytes, calls runtime.abort<0> 8 bytes over limit grows 16 bytes, calls runtime.save_g<0> 8 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 8 bytes over limit grows 16 bytes, calls runtime.save_g<0> 8 bytes over limit grows 48 bytes, calls runtime.fatalthrow<1> grows 64 bytes, calls runtime.systemstack<0> grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 72 bytes over limit grows 16 bytes, calls runtime.abort<0> 72 bytes over limit grows 16 bytes, calls gosave_systemstack_switch<21> grows 0 bytes, calls runtime.abort<0> 72 bytes over limit grows 16 bytes, calls runtime.save_g<0> 72 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 72 bytes over limit grows 16 bytes, calls runtime.save_g<0> 72 bytes over limit grows 64 bytes, calls runtime.throw<1> grows 48 bytes, calls runtime.systemstack<0> grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 8 bytes over limit grows 16 bytes, calls runtime.abort<0> 8 bytes over limit grows 16 bytes, calls gosave_systemstack_switch<21> grows 0 bytes, calls runtime.abort<0> 8 bytes over limit grows 16 bytes, calls runtime.save_g<0> 8 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 8 bytes over limit grows 16 bytes, calls runtime.save_g<0> 8 bytes over limit grows 48 bytes, calls runtime.fatalthrow<1> grows 64 bytes, calls runtime.systemstack<0> grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 72 bytes over limit grows 16 bytes, calls runtime.abort<0> 72 bytes over limit grows 16 bytes, calls gosave_systemstack_switch<21> grows 0 bytes, calls runtime.abort<0> 72 bytes over limit grows 16 bytes, calls runtime.save_g<0> 72 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 72 bytes over limit grows 16 bytes, calls runtime.save_g<0> 72 bytes over limit grows 64 bytes, calls runtime.casgstatus<1> grows 80 bytes, calls runtime.nanotime<1> grows 32 bytes, calls runtime.nanotime1<0> grows 48 bytes, calls runtime.libcCall<1> grows 64 bytes, calls runtime.(*guintptr).set<1> 24 bytes over limit grows 64 bytes, calls runtime.asmcgocall<0> grows 16 bytes, calls gosave_systemstack_switch<21> grows 0 bytes, calls runtime.abort<0> 40 bytes over limit grows 16 bytes, calls runtime.save_g<0> 40 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 40 bytes over limit grows 16 bytes, calls runtime.save_g<0> 40 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 40 bytes over limit grows 80 bytes, calls runtime.nanotime<1> grows 32 bytes, calls runtime.nanotime1<0> grows 48 bytes, calls runtime.libcCall<1> grows 64 bytes, calls runtime.(*guintptr).set<1> 24 bytes over limit grows 64 bytes, calls runtime.asmcgocall<0> grows 16 bytes, calls gosave_systemstack_switch<21> grows 0 bytes, calls runtime.abort<0> 40 bytes over limit grows 16 bytes, calls runtime.save_g<0> 40 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 40 bytes over limit grows 16 bytes, calls runtime.save_g<0> 40 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 40 bytes over limit grows 80 bytes, calls runtime.osyield<1> grows 32 bytes, calls runtime.usleep<0> grows 32 bytes, calls runtime.libcCall<1> grows 64 bytes, calls runtime.(*guintptr).set<1> 8 bytes over limit grows 64 bytes, calls runtime.asmcgocall<0> grows 16 bytes, calls gosave_systemstack_switch<21> grows 0 bytes, calls runtime.abort<0> 24 bytes over limit grows 16 bytes, calls runtime.save_g<0> 24 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 24 bytes over limit grows 16 bytes, calls runtime.save_g<0> 24 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 24 bytes over limit grows 80 bytes, calls runtime.nanotime<1> grows 32 bytes, calls runtime.nanotime1<0> grows 48 bytes, calls runtime.libcCall<1> grows 64 bytes, calls runtime.(*guintptr).set<1> 24 bytes over limit grows 64 bytes, calls runtime.asmcgocall<0> grows 16 bytes, calls gosave_systemstack_switch<21> grows 0 bytes, calls runtime.abort<0> 40 bytes over limit grows 16 bytes, calls runtime.save_g<0> 40 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 40 bytes over limit grows 16 bytes, calls runtime.save_g<0> 40 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 40 bytes over limit grows 80 bytes, calls runtime.nanotime<1> grows 32 bytes, calls runtime.nanotime1<0> grows 48 bytes, calls runtime.libcCall<1> grows 64 bytes, calls runtime.(*guintptr).set<1> 24 bytes over limit grows 64 bytes, calls runtime.asmcgocall<0> grows 16 bytes, calls gosave_systemstack_switch<21> grows 0 bytes, calls runtime.abort<0> 40 bytes over limit grows 16 bytes, calls runtime.save_g<0> 40 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 40 bytes over limit grows 16 bytes, calls runtime.save_g<0> 40 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 40 bytes over limit grows 80 bytes, calls runtime.nanotime<1> grows 32 bytes, calls runtime.nanotime1<0> grows 48 bytes, calls runtime.libcCall<1> grows 64 bytes, calls runtime.(*guintptr).set<1> 24 bytes over limit grows 64 bytes, calls runtime.asmcgocall<0> grows 16 bytes, calls gosave_systemstack_switch<21> grows 0 bytes, calls runtime.abort<0> 40 bytes over limit grows 16 bytes, calls runtime.save_g<0> 40 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 40 bytes over limit grows 16 bytes, calls runtime.save_g<0> 40 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 40 bytes over limit grows 80 bytes, calls runtime.throw<1> grows 48 bytes, calls runtime.fatalthrow<1> grows 64 bytes, calls runtime.systemstack<0> grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 8 bytes over limit grows 16 bytes, calls runtime.abort<0> 8 bytes over limit grows 16 bytes, calls gosave_systemstack_switch<21> grows 0 bytes, calls runtime.abort<0> 8 bytes over limit grows 16 bytes, calls runtime.save_g<0> 8 bytes over limit grows 16 bytes, calls indirect grows 0 bytes, calls runtime.morestack<0> 8 bytes over limit grows 16 bytes, calls runtime.save_g<0> 8 bytes over limit
Without -race
everything compiles fine.
About this issue
- Original URL
- State: closed
- Created 2 years ago
- Reactions: 18
- Comments: 30 (15 by maintainers)
Commits related to this issue
- syscall: fix sycall.ptrace cause nosplit stack over 792 byte limit Fixes #54291 — committed to cuiweixie/go by cuiweixie 2 years ago
- syscall: fix sycall.ptrace cause nosplit stack over 792 byte limit Fixes #54291 — committed to cuiweixie/go by cuiweixie 2 years ago
- syscall: fix sycall.ptrace cause nosplit stack over 792 byte limit Fixes #54291 — committed to cuiweixie/go by cuiweixie 2 years ago
- Try to get validation, can't debug See https://github.com/golang/go/issues/54291 — committed to rfay/colima by rfay 2 years ago
- Try to get validation, can't debug See https://github.com/golang/go/issues/54291 — committed to rfay/colima by rfay 2 years ago
@mknyszek in VSCode (with vscode-golang), the settings used when running/building tests are the same for running tests and debugging tests, and there is no easy way to pass settings just for debugging or just for testing. This problem affects my company because we want to always enable the race detector when running tests, so we ship a shared config that sets
Unfortunately, this bug means that when we upgraded to 1.19, we can no longer use the debugger in vscode through vscode-golang, since it automatically includes the test flags when building the debug binary. This works just fine in 1.18, but breaks in 1.19, so we’ve since downgraded to 1.18.
I don’t know the best way to fix this; it’s possible that in vscode-go (and i guess in other editors like Goland, as reported above) it could be solved by making it possible to pass flags “just when running tests” and “just when debugging tests”. But that means every editor / setup needs to support that, and in general, encouraging your debug/testing/building code to special-case certain paths leads to increased chance of divergence and unexpected problems.
I think that this should be considered a supported build configuration because ~i’m using it~ it’s likely that many VSCode users would like to use the race detector by default, and also want to be able to debug their tests. I cannot prove this though!
I also have “-race” added to all projects that I develop by default so that I can always get race information. I don’t feel comfortable removing “-race” when I need to debug. Everything worked correctly before, why shouldn’t it work now?
same issue with VSCode & golang1.19.1 .
Leaving this here in case it helps someone:
vendor/gvisor.dev/gvisor/pkg/refs/refcounter.go
, delete the line with the//go:nosplit
directivebelow is Goland debug setting
as you can see debug with race must has “-N -l” setting, you even can not remove it
click with debug

@ianlancetaylor
I can reproduce it stably now. (go version go1.19 darwin/amd64)
Output
The 1.20 release fixes this for me.
To be clear, I’m not saying that we’re necessarily going to make this a supported build configuration, but we should figure out what we’re going to do.
@clarkmcc Unfortunately, that case seems gVisor-specific. They use
//go:nosplit
directly which is not backed by the Go 1 backwards compatibility guarantee outside the standard library (https://groups.google.com/g/golang-nuts/c/Tq3cFNlg7ac/m/okpXURdiAgAJ). (We wouldn’t pull the rug out from everyone using//go:nosplit
without a warning, but it is technically an implementation detail and the Go runtime’s implementation may change.) I think it’s up to them if they support the-gcflags all=-N -l
configuration.This is different from OP’s error because that’s a break in standard library usage (for a technically unsupported configuration, but one that is apparently difficult for many to work around at this point in time).
I’m not certain what we’re going to do about this as this isn’t necessarily a supported build configuration (AFAICT).
@cuonglm filed an upstream bug with Goland: https://youtrack.jetbrains.com/issue/GO-13486/Show-warning-when-debug-is-started-with-the-race-option. Assigning this @cuonglm for now. (Feel free to unassign! This is non-binding, just for triage. 😃)
debug with race to fix sync issues is quite usually for Gland users like me!