go icon indicating copy to clipboard operation
go copied to clipboard

cmd/go: default godebug settings not recorded for test binaries

Open seankhliao opened this issue 1 month ago • 1 comments

Go version

go version devel go1.23-e44fa1c1a9 2024-06-18 15:33:06 +0000 linux/amd64

Output of go env in your module/workspace:

GO111MODULE=''
GOARCH='amd64'
GOBIN=''
GOCACHE='/home/user/.cache/go-build'
GOENV='/home/user/.config/go/env'
GOEXE=''
GOEXPERIMENT='cacheprog'
GOFLAGS='-trimpath "-ldflags=-s -w"'
GOHOSTARCH='amd64'
GOHOSTOS='linux'
GOINSECURE=''
GOMODCACHE='/home/user/.data/go/pkg/mod'
GONOPROXY=''
GONOSUMDB=''
GOOS='linux'
GOPATH='/home/user/.data/go'
GOPRIVATE=''
GOPROXY='https://proxy.golang.org,direct'
GOROOT='/home/user/sdk/gotip'
GOSUMDB='sum.golang.org'
GOTMPDIR=''
GOTOOLCHAIN='path'
GOTOOLDIR='/home/user/sdk/gotip/pkg/tool/linux_amd64'
GOVCS=''
GOVERSION='devel go1.23-e44fa1c1a9 2024-06-18 15:33:06 +0000'
GODEBUG=''
GOTELEMETRY='local'
GOTELEMETRYDIR='/home/user/.config/go/telemetry'
GCCGO='gccgo'
GOAMD64='v3'
AR='ar'
CC='gcc'
CXX='g++'
CGO_ENABLED='0'
GOMOD='/home/user/tmp/testrepo0652/go.mod'
GOWORK=''
CGO_CFLAGS='-O2 -g'
CGO_CPPFLAGS=''
CGO_CXXFLAGS='-O2 -g'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'
PKG_CONFIG='pkg-config'
GOGCCFLAGS='-fPIC -m64 -Wl,--no-gc-sections -fmessage-length=0 -ffile-prefix-map=/tmp/go-build1549253000=/tmp/go-build -gno-record-gcc-switches'

What did you do?

for a main_test.go (note: should be run without the main.go file below as it can affect the debug settings):

//go:debug panicnil=1
package main_test

import (
	"runtime/debug"
	"testing"
)

func TestFoo(t *testing.T) {
	defer func() {
		t.Fatal(recover())
	}()

	t.Log(debug.ReadBuildInfo())
	panic(nil)
}

running it:

=== RUN   TestFoo
    main_test.go:14: go	devel go1.23-e44fa1c1a9 2024-06-18 15:33:06 +0000 X:cacheprog
        path	go.seankhliao.com/testrepo0652
        mod	go.seankhliao.com/testrepo0652	(devel)	
        build	-buildmode=exe
        build	-compiler=gc
        build	-trimpath=true
        build	DefaultGODEBUG=asynctimerchan=1,gotypesalias=0,tls3des=1,tlskyber=0,x509keypairleaf=0,x509negativeserial=1
        build	CGO_ENABLED=0
        build	GOARCH=amd64
        build	GOEXPERIMENT=cacheprog
        build	GOOS=linux
        build	GOAMD64=v3
         true
    main_test.go:11: <nil>
--- FAIL: TestFoo (0.00s)
FAIL
FAIL	go.seankhliao.com/testrepo0652	0.001s
FAIL

vs

a main.go:

//go:debug panicnil=1
package main

import (
	"fmt"
	"runtime/debug"
)

func main() {
	defer func() {
		fmt.Println(recover())
	}()

	fmt.Println(debug.ReadBuildInfo())
	panic(nil)
}

running it:

go	devel go1.23-e44fa1c1a9 2024-06-18 15:33:06 +0000 X:cacheprog
path	go.seankhliao.com/testrepo0652
mod	go.seankhliao.com/testrepo0652	(devel)	
build	-buildmode=exe
build	-compiler=gc
build	-trimpath=true
build	DefaultGODEBUG=asynctimerchan=1,gotypesalias=0,panicnil=1,tls3des=1,tlskyber=0,x509keypairleaf=0,x509negativeserial=1
build	CGO_ENABLED=0
build	GOARCH=amd64
build	GOEXPERIMENT=cacheprog
build	GOOS=linux
build	GOAMD64=v3
 true
<nil>

What did you see happen?

The test binary did not record a DefaultGODEBUG=panicnil=1, while the setting was clearly in effect (recover nil).

What did you expect to see?

The setting recorded as part of DefaultGODEBUG

seankhliao avatar Jun 18 '24 16:06 seankhliao