Commit 1a7fc235 authored by Emmanuel Odeke's avatar Emmanuel Odeke Committed by Ian Lance Taylor

runtime: print signal name in panic, if name is known

Adds a small function signame that infers a signal name
from the signal table, otherwise will fallback to using
hex(sig) as previously. No signal table is present for
Windows hence it will always print the hex value.

Sample code and new result:
```go
package main

import (
  "fmt"
  "time"
)

func main() {
  defer func() {
    if err := recover(); err != nil {
      fmt.Printf("err=%v\n", err)
    }
  }()

  ticker := time.Tick(1e9)
  for {
    <-ticker
  }
}
```

```shell
$ go run main.go &
$ kill -11 <pid>
fatal error: unexpected signal during runtime execution
[signal SIGSEGV: segmentation violation code=0x1 addr=0xb01dfacedebac1e
pc=0xc71db]
...
```

Fixes #13969

Change-Id: Ie6be312eb766661f1cea9afec352b73270f27f9d
Reviewed-on: https://go-review.googlesource.com/22753Reviewed-by: 's avatarIan Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent fafd792d
...@@ -56,6 +56,13 @@ func osinit() { ...@@ -56,6 +56,13 @@ func osinit() {
//nacl_exception_handler(funcPC(sigtramp), nil); //nacl_exception_handler(funcPC(sigtramp), nil);
} }
func signame(sig uint32) string {
if sig >= uint32(len(sigtable)) {
return ""
}
return sigtable[sig].name
}
func crash() { func crash() {
*(*int32)(nil) = 0 *(*int32)(nil) = 0
} }
......
...@@ -286,3 +286,10 @@ func _atoi(b []byte) int { ...@@ -286,3 +286,10 @@ func _atoi(b []byte) int {
} }
return n return n
} }
func signame(sig uint32) string {
if sig >= uint32(len(sigtable)) {
return ""
}
return sigtable[sig].name
}
...@@ -641,7 +641,13 @@ var deadlock mutex ...@@ -641,7 +641,13 @@ var deadlock mutex
func dopanic_m(gp *g, pc, sp uintptr) { func dopanic_m(gp *g, pc, sp uintptr) {
if gp.sig != 0 { if gp.sig != 0 {
print("[signal ", hex(gp.sig), " code=", hex(gp.sigcode0), " addr=", hex(gp.sigcode1), " pc=", hex(gp.sigpc), "]\n") signame := signame(gp.sig)
if signame != "" {
print("[signal ", signame)
} else {
print("[signal ", hex(gp.sig))
}
print(" code=", hex(gp.sigcode0), " addr=", hex(gp.sigcode1), " pc=", hex(gp.sigpc), "]\n")
} }
level, all, docrash := gotraceback() level, all, docrash := gotraceback()
......
...@@ -12,3 +12,10 @@ import _ "unsafe" // for go:linkname ...@@ -12,3 +12,10 @@ import _ "unsafe" // for go:linkname
func os_sigpipe() { func os_sigpipe() {
systemstack(sigpipe) systemstack(sigpipe)
} }
func signame(sig uint32) string {
if sig >= uint32(len(sigtable)) {
return ""
}
return sigtable[sig].name
}
...@@ -209,6 +209,10 @@ func raisebadsignal(sig int32) { ...@@ -209,6 +209,10 @@ func raisebadsignal(sig int32) {
badsignal2() badsignal2()
} }
func signame(sig uint32) string {
return ""
}
func crash() { func crash() {
// TODO: This routine should do whatever is needed // TODO: This routine should do whatever is needed
// to make the Windows program abort/crash as it // to make the Windows program abort/crash as it
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment