diff options
| author | Cherry Mui <cherryyz@google.com> | 2023-06-02 17:54:57 -0400 |
|---|---|---|
| committer | Cherry Mui <cherryyz@google.com> | 2023-06-05 15:24:08 +0000 |
| commit | 6dd3bfbed6f17e7789f092e96408c00c227a8b68 (patch) | |
| tree | 1b4ba2a190788f3b431a4b9affd17cc82d765ba7 /src/runtime/testdata/testprog | |
| parent | 96b79bd3208078835d6a1b9b8c7050554eccc734 (diff) | |
| download | go-6dd3bfbed6f17e7789f092e96408c00c227a8b68.tar.xz | |
runtime: move Segv and TgkillSegv to testprog
The non-cgo test points Segv and TgkillSegv are currently in
testprogcgo. Although the test points don't explicitly use cgo,
being a cgo program, there is still some C code that runs when
the test point is invoked, such as thread creation code.
For the cgo test points, sometimes we fail to unwind the stack if
C code is involved. For the non-cgo ones, we want to always be
able to unwind the stack, so we check for stack unwinding failures.
But if a signal is landed in the small piece of C code mentioned
above, we may still fail to unwind. Move the non-cgo test points
to a pure-Go program to avoid this problem.
May fix #52963.
Updates #59029, #59443, #59492.
Change-Id: I35d99a0dd4c7cdb627e2083d2414887a24a2822d
Reviewed-on: https://go-review.googlesource.com/c/go/+/500535
Reviewed-by: Michael Knyszek <mknyszek@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Cherry Mui <cherryyz@google.com>
Diffstat (limited to 'src/runtime/testdata/testprog')
| -rw-r--r-- | src/runtime/testdata/testprog/segv.go | 32 | ||||
| -rw-r--r-- | src/runtime/testdata/testprog/segv_linux.go | 29 |
2 files changed, 61 insertions, 0 deletions
diff --git a/src/runtime/testdata/testprog/segv.go b/src/runtime/testdata/testprog/segv.go new file mode 100644 index 0000000000..8547726968 --- /dev/null +++ b/src/runtime/testdata/testprog/segv.go @@ -0,0 +1,32 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build unix + +package main + +import "syscall" + +func init() { + register("Segv", Segv) +} + +var Sum int + +func Segv() { + c := make(chan bool) + go func() { + close(c) + for i := 0; ; i++ { + Sum += i + } + }() + + <-c + + syscall.Kill(syscall.Getpid(), syscall.SIGSEGV) + + // Wait for the OS to deliver the signal. + select {} +} diff --git a/src/runtime/testdata/testprog/segv_linux.go b/src/runtime/testdata/testprog/segv_linux.go new file mode 100644 index 0000000000..aa386bbf25 --- /dev/null +++ b/src/runtime/testdata/testprog/segv_linux.go @@ -0,0 +1,29 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import "syscall" + +func init() { + register("TgkillSegv", TgkillSegv) +} + +func TgkillSegv() { + c := make(chan bool) + go func() { + close(c) + for i := 0; ; i++ { + // Sum defined in segv.go. + Sum += i + } + }() + + <-c + + syscall.Tgkill(syscall.Getpid(), syscall.Gettid(), syscall.SIGSEGV) + + // Wait for the OS to deliver the signal. + select {} +} |
