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
|
things like file and directory names, so please either redact it before
|
||||||
uploading it somewhere or post only the parts that are really relevant.
|
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
|
Development Environment
|
||||||
=======================
|
=======================
|
||||||
|
|
|
@ -62,6 +62,12 @@ func CleanupHandler(c <-chan os.Signal) {
|
||||||
debug.Log("signal %v received, cleaning up", s)
|
debug.Log("signal %v received, cleaning up", s)
|
||||||
Warnf("%ssignal %v received, cleaning up\n", clearLine(0), 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
|
code := 0
|
||||||
|
|
||||||
if s == syscall.SIGINT {
|
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