Be sure your env has GOTRACEBACK set to "single" or "all" or "system" 
(see https://pkg.go.dev/runtime) and not "none". Panic usually shows the 
trace by default, but I suspect t.Run() may be covering it up so I would 
try on just a simple raw func TestOne(t *testing.T) {...} first. It is 
possible to have some of the layers of test infrastructure hide things from 
you, but I couldn't tell you exactly how, so start simple.

My usual way to halt a Go program and get a stack trace is to send SIGQUIT 
using "pkill -QUIT project.test". 

kill -QUIT also kills the program though, which is fine if it is deadlocked 
and you are trying to figure out where. But if you want to keep it alive 
and look at a goroutine stack snapshot, you can start the program with 
pprof sampling as described https://pkg.go.dev/net/http/pprof and then 
opening a browser and hitting the port like http://localhost:6060; if you 
did:

import _ "net/http/pprof"
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()

On Monday, June 15, 2026 at 7:39:29 PM UTC-3 Tom Limoncelli wrote:

> Is there a way to get "go test" to display the stack trace when the 
> function under test panics?
>
> I've written a function that (for purposes of this demo) panics if passed 
> true:
>
> https://go.dev/play/p/lGVenZjDRpD
>
> The output on go playground looks like this:
>
> === RUN   TestMyFunc
> === RUN   TestMyFunc/good
> === RUN   TestMyFunc/panic
> --- FAIL: TestMyFunc (0.00s)
>     --- PASS: TestMyFunc/good (0.00s)
>     --- FAIL: TestMyFunc/panic (0.00s)
> panic: assignment to entry in nil map [recovered, repanicked]
>
> goroutine 17 [running]:
> testing.tRunner.func1.2({0x55a800, 0x6cac00})
> /usr/local/go-faketime/src/testing/testing.go:1974 +0x232
> testing.tRunner.func1()
> /usr/local/go-faketime/src/testing/testing.go:1977 +0x349
> panic({0x55a800?, 0x6cac00?})
> /usr/local/go-faketime/src/runtime/panic.go:860 +0x13a
> play.MyFunc(...)
> /tmp/sandbox252008880/prog_test.go:14
> play.TestMyFunc.func1(0x3e938180e008?)
> /tmp/sandbox252008880/prog_test.go:33 +0x33
> testing.tRunner(0x3e938180e008, 0x3e9381800000)
> /usr/local/go-faketime/src/testing/testing.go:2036 +0xea
> created by testing.(*T).Run in goroutine 7
> /usr/local/go-faketime/src/testing/testing.go:2101 +0x4c5
>
> Program exited.
>
> However when I run this on my personal machine (go1.26.4, Macos 26.5.1) 
> the system goes into an infinite loop until I press CTRL-C.  At that point 
> it exits but never shows the stack trace:
>  
> $ go test -v 
> === RUN   TestMyFunc
> === RUN   TestMyFunc/good
> === RUN   TestMyFunc/panic
> --- FAIL: TestMyFunc (0.00s)
>     --- PASS: TestMyFunc/good (0.00s)
>     --- FAIL: TestMyFunc/panic (0.00s)
> ^Csignal: interrupt
> FAIL ptest 4.924s
>
>
> As you can imagine, debugging an unknown panic is difficult without the 
> stack trace indicating the problematic line.  Delve has the same behavior.
>
> Is there a way to have "go test" display the stack trace like Go 
> playground does?
>
> Also... the fact that a panic sends Go testing into an infinite loop 
> sounds like a bug.  Is this just my environment, or can others reproduce 
> this?
>
> Thanks in advance!
> Tom
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion visit 
https://groups.google.com/d/msgid/golang-nuts/216b0486-4520-4b5f-a2e4-6286e494772fn%40googlegroups.com.

Reply via email to