summaryrefslogtreecommitdiff
path: root/misc
diff options
context:
space:
mode:
authorElias Naur <elias.naur@gmail.com>2018-05-23 16:31:36 +0200
committerElias Naur <elias.naur@gmail.com>2018-05-23 18:18:39 +0000
commit7ba1c91dd999681425c2e1053b854f218ea3f2f8 (patch)
tree9c92499b7227eabadcfa32139a680c3df19a3240 /misc
parent77c51c6c627e1f4f99305d0ffdf88daa18f43391 (diff)
downloadgo-git-7ba1c91dd999681425c2e1053b854f218ea3f2f8.tar.gz
misc/android: forward SIGQUIT to the process running on the device
When a test binary runs for too long, the go command sends it a SIGQUIT to force a backtrace dump. On Android, the exec wrapper will instead receive the signal and dump its backtrace. Forward SIGQUIT signals from the wrapper to the wrapped process to gain useful backtraces. Inspired by issuse 25519; this CL would have revealed the hanging test directly in the builder log. Change-Id: Ic362d06940d261374343a1dc09366ef54edaa631 Reviewed-on: https://go-review.googlesource.com/114137 Run-TryBot: Elias Naur <elias.naur@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'misc')
-rw-r--r--misc/android/go_android_exec.go19
1 files changed, 17 insertions, 2 deletions
diff --git a/misc/android/go_android_exec.go b/misc/android/go_android_exec.go
index 5671479d87..c6270872c7 100644
--- a/misc/android/go_android_exec.go
+++ b/misc/android/go_android_exec.go
@@ -14,10 +14,12 @@ import (
"log"
"os"
"os/exec"
+ "os/signal"
"path/filepath"
"runtime"
"strconv"
"strings"
+ "syscall"
)
func run(args ...string) string {
@@ -73,8 +75,8 @@ func main() {
// Binary names can conflict.
// E.g. template.test from the {html,text}/template packages.
- binName := filepath.Base(os.Args[1])
- deviceBin := fmt.Sprintf("%s/%s-%d", deviceGotmp, binName, os.Getpid())
+ binName := fmt.Sprintf("%s-%d", filepath.Base(os.Args[1]), os.Getpid())
+ deviceBin := fmt.Sprintf("%s/%s", deviceGotmp, binName)
// The push of the binary happens in parallel with other tests.
// Unfortunately, a simultaneous call to adb shell hold open
@@ -85,6 +87,17 @@ func main() {
run("shell", "cp '"+deviceBin+"-tmp' '"+deviceBin+"'")
run("shell", "rm '"+deviceBin+"-tmp'")
+ // Forward SIGQUIT from the go command to show backtraces from
+ // the binary instead of from this wrapper.
+ quit := make(chan os.Signal, 1)
+ signal.Notify(quit, syscall.SIGQUIT)
+ go func() {
+ for range quit {
+ // We don't have the PID of the running process; use the
+ // binary name instead.
+ run("shell", "killall -QUIT "+binName)
+ }
+ }()
// The adb shell command will return an exit code of 0 regardless
// of the command run. E.g.
// $ adb shell false
@@ -100,6 +113,8 @@ func main() {
"; '" + deviceBin + "' " + strings.Join(os.Args[2:], " ") +
"; echo -n " + exitstr + "$?"
output := run("shell", cmd)
+ signal.Reset(syscall.SIGQUIT)
+ close(quit)
run("shell", "rm", "-rf", deviceGotmp) // Clean up.