Skip to content

Commit 89f83c2

Browse files
authored
Dump stacktrace upon SIGABRT (#3366)
Signed-off-by: Yacov Manevich <yacov.manevich@avalabs.org>
1 parent b89d6c6 commit 89f83c2

File tree

1 file changed

+23
-8
lines changed

1 file changed

+23
-8
lines changed

app/app.go

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"golang.org/x/sync/errgroup"
1515

1616
"github.com/ava-labs/avalanchego/node"
17+
"github.com/ava-labs/avalanchego/utils"
1718
"github.com/ava-labs/avalanchego/utils/logging"
1819
"github.com/ava-labs/avalanchego/utils/perms"
1920
"github.com/ava-labs/avalanchego/utils/ulimit"
@@ -90,26 +91,40 @@ func Run(app App) int {
9091
return 1
9192
}
9293

93-
// register signals to kill the application
94-
signals := make(chan os.Signal, 1)
95-
signal.Notify(signals, syscall.SIGINT)
96-
signal.Notify(signals, syscall.SIGTERM)
94+
// register terminationSignals to kill the application
95+
terminationSignals := make(chan os.Signal, 1)
96+
signal.Notify(terminationSignals, syscall.SIGINT, syscall.SIGTERM)
97+
98+
stackTraceSignal := make(chan os.Signal, 1)
99+
signal.Notify(stackTraceSignal, syscall.SIGABRT)
97100

98101
// start up a new go routine to handle attempts to kill the application
99102
var eg errgroup.Group
100103
eg.Go(func() error {
101-
for range signals {
104+
for range terminationSignals {
102105
return app.Stop()
103106
}
104107
return nil
105108
})
106109

110+
// start a goroutine to listen on SIGABRT signals,
111+
// to print the stack trace to standard error.
112+
go func() {
113+
for range stackTraceSignal {
114+
fmt.Fprint(os.Stderr, utils.GetStacktrace(true))
115+
}
116+
}()
117+
107118
// wait for the app to exit and get the exit code response
108119
exitCode, err := app.ExitCode()
109120

110-
// shut down the signal go routine
111-
signal.Stop(signals)
112-
close(signals)
121+
// shut down the termination signal go routine
122+
signal.Stop(terminationSignals)
123+
close(terminationSignals)
124+
125+
// shut down the stack trace go routine
126+
signal.Stop(stackTraceSignal)
127+
close(stackTraceSignal)
113128

114129
// if there was an error closing or running the application, report that error
115130
if eg.Wait() != nil || err != nil {

0 commit comments

Comments
 (0)