Skip to content

Commit e2671b0

Browse files
feat: report stacktrace on callback recover
1 parent 714f7ec commit e2671b0

File tree

1 file changed

+15
-0
lines changed

1 file changed

+15
-0
lines changed

instance_data.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import "C"
3636

3737
import (
3838
"fmt"
39+
"runtime"
3940
"runtime/cgo"
4041
"sync"
4142
"unsafe"
@@ -107,6 +108,10 @@ var _ InstanceDataProvider = &NapiGoInstanceData{}
107108
var _ CallbackDataProvider = &NapiGoInstanceCallbackData{}
108109
var _ AsyncWorkDataProvider = &NapiGoInstanceAsyncWorkData{}
109110

111+
const (
112+
maxStackTraceSize = 8192
113+
)
114+
110115
func InitializeInstanceData(env Env) Status {
111116
return setInstanceData(env, &NapiGoInstanceData{})
112117
}
@@ -130,6 +135,7 @@ func DeleteCallbackData(
130135
err := recover()
131136
if err != nil {
132137
fmt.Printf("napi.DeleteCallbackData: Recovered from panic: %s\n", err)
138+
reportStackTrace()
133139

134140
msg := "unknown error"
135141
if err, ok := err.(error); ok {
@@ -158,6 +164,7 @@ func ExecuteCallback(
158164
err := recover()
159165
if err != nil {
160166
fmt.Printf("napi.ExecuteCallback: Recovered from panic: %s\n", err)
167+
reportStackTrace()
161168

162169
msg := "unknown error"
163170
if err, ok := err.(error); ok {
@@ -205,6 +212,7 @@ func ExecuteAsyncExecuteCallback(cEnv C.napi_env, cData unsafe.Pointer) {
205212
"napi.ExecuteAsyncExecuteCallback: Recovered from panic: %s\n",
206213
err,
207214
)
215+
reportStackTrace()
208216

209217
msg := "unknown error"
210218
if err, ok := err.(error); ok {
@@ -238,6 +246,7 @@ func ExecuteAsyncCompleteCallback(
238246
"napi.ExecuteAsyncExecuteCallback: Recovered from panic: %s\n",
239247
err,
240248
)
249+
reportStackTrace()
241250

242251
msg := "unknown error"
243252
if err, ok := err.(error); ok {
@@ -301,6 +310,12 @@ func setInstanceData(env Env, data *NapiGoInstanceData) Status {
301310
))
302311
}
303312

313+
func reportStackTrace() {
314+
stackTraceBuf := make([]byte, maxStackTraceSize)
315+
stackTraceSz := runtime.Stack(stackTraceBuf, false)
316+
fmt.Printf("%s\n", string(stackTraceBuf[:stackTraceSz]))
317+
}
318+
304319
func (d *NapiGoInstanceData) GetUserData() any {
305320
return d.UserData
306321
}

0 commit comments

Comments
 (0)