forked from TrueCloudLab/restic
Print stacktrace in SIGINT handler if RESTIC_DEBUG_STACKTRACE_SIGINT set
The builtin mechanism to capture a stacktrace in Go is to send a SIGQUIT to the running process. However, this mechanism is not avaiable on Windows. Thus, tweak the SIGINT handler to dump a stacktrace if the environment variable `RESTIC_DEBUG_STACKTRACE_SIGINT` is set.
This commit is contained in:
parent
41cc320145
commit
306a29980a
3 changed files with 31 additions and 0 deletions
|
@ -58,6 +58,16 @@ Please be aware that the debug log file will contain potentially sensitive
|
|||
things like file and directory names, so please either redact it before
|
||||
uploading it somewhere or post only the parts that are really relevant.
|
||||
|
||||
If restic gets stuck, please also include a stacktrace in the description.
|
||||
On non-Windows systems, you can send a SIGQUIT signal to restic or press
|
||||
`Ctrl-\` to achieve the same result. This causes restic to print a stacktrace
|
||||
and then exit immediatelly. This will not damage your repository, however,
|
||||
it might be necessary to manually clean up stale lock files using
|
||||
`restic unlock`.
|
||||
|
||||
On Windows, please set the environment variable `RESTIC_DEBUG_STACKTRACE_SIGINT`
|
||||
to `true` and press `Ctrl-C` to create a stacktrace.
|
||||
|
||||
|
||||
Development Environment
|
||||
=======================
|
||||
|
|
|
@ -62,6 +62,12 @@ func CleanupHandler(c <-chan os.Signal) {
|
|||
debug.Log("signal %v received, cleaning up", s)
|
||||
Warnf("%ssignal %v received, cleaning up\n", clearLine(0), s)
|
||||
|
||||
if val, _ := os.LookupEnv("RESTIC_DEBUG_STACKTRACE_SIGINT"); val != "" {
|
||||
_, _ = os.Stderr.WriteString("\n--- STACKTRACE START ---\n\n")
|
||||
_, _ = os.Stderr.WriteString(debug.DumpStacktrace())
|
||||
_, _ = os.Stderr.WriteString("\n--- STACKTRACE END ---\n")
|
||||
}
|
||||
|
||||
code := 0
|
||||
|
||||
if s == syscall.SIGINT {
|
||||
|
|
15
internal/debug/stacktrace.go
Normal file
15
internal/debug/stacktrace.go
Normal file
|
@ -0,0 +1,15 @@
|
|||
package debug
|
||||
|
||||
import "runtime"
|
||||
|
||||
func DumpStacktrace() string {
|
||||
buf := make([]byte, 128*1024)
|
||||
|
||||
for {
|
||||
l := runtime.Stack(buf, true)
|
||||
if l < len(buf) {
|
||||
return string(buf[:l])
|
||||
}
|
||||
buf = make([]byte, len(buf)*2)
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue