aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDaniel Gavin <danielgavin5@hotmail.com>2022-08-17 01:42:00 +0200
committerDaniel Gavin <danielgavin5@hotmail.com>2022-08-17 01:42:00 +0200
commit98a585f6d3793e223e226f45704d330a94ecfbab (patch)
treef8f5f25164c7b90df35c34a09329051209cdc758 /src
parent785dec43913f9445a7495da1bb3347f24adc3c87 (diff)
rename to windows suffix
Diffstat (limited to 'src')
-rw-r--r--src/dump_windows.odin78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/dump_windows.odin b/src/dump_windows.odin
new file mode 100644
index 0000000..96908fd
--- /dev/null
+++ b/src/dump_windows.odin
@@ -0,0 +1,78 @@
+package main
+
+import "core:os"
+import "core:slice"
+import "core:strings"
+import "core:intrinsics"
+import "core:runtime"
+import "core:io"
+import "core:sync"
+import "core:path/filepath"
+import "core:log"
+import "core:fmt"
+
+import "pdb"
+
+import windows "core:sys/windows"
+
+set_stacktrace :: proc() {
+ pdb.SetUnhandledExceptionFilter(dump_stack_trace_on_exception_logger)
+}
+
+print_source_code_location_builder :: proc (using scl: runtime.Source_Code_Location) -> string {
+ using runtime
+
+ builder := strings.builder_make()
+
+ strings.write_string(&builder, file_path)
+ when ODIN_ERROR_POS_STYLE == .Unix {
+ strings.write_string(&builder, ':')
+ strings.write_i64(&builder, cast(i64)line)
+ strings.write_string(&builder, ':')
+ strings.write_i64(&builder, cast(i64)column)
+ strings.write_string(&builder, ':')
+ } else {
+ strings.write_string(&builder, "(")
+ strings.write_i64(&builder, cast(i64)line)
+ strings.write_string(&builder,":")
+ strings.write_i64(&builder, cast(i64)column)
+ strings.write_string(&builder, ")")
+ }
+ strings.write_string(&builder,procedure)
+ strings.write_string(&builder,"()\n")
+
+ return strings.to_string(builder)
+}
+
+
+dump_stack_trace_on_exception_logger :: proc "stdcall" (ExceptionInfo: ^windows.EXCEPTION_POINTERS) -> windows.LONG {
+ using pdb
+ context = runtime.default_context() // TODO: use a more efficient one-off allocators
+ context.logger = logger
+
+ builder := strings.builder_make()
+
+ sync.guard(&_dumpStackTrackMutex)
+
+ if ExceptionInfo.ExceptionRecord != nil {
+ strings.write_string(&builder, fmt.tprintf("%v, Flags: 0x %v", ExceptionInfo.ExceptionRecord.ExceptionCode, ExceptionInfo.ExceptionRecord.ExceptionFlags))
+ }
+
+ ctxt := cast(^CONTEXT)ExceptionInfo.ContextRecord
+ traceBuf : [64]StackFrame
+ traceCount := capture_stack_trace_from_context(ctxt, traceBuf[:])
+ strings.write_string(&builder, " Stacktrace:")
+ strings.write_uint(&builder, traceCount)
+ strings.write_string(&builder, "\n")
+ srcCodeLocs : RingBuffer(runtime.Source_Code_Location)
+ init_rb(&srcCodeLocs, 64)
+ parse_stack_trace(traceBuf[:traceCount], true, &srcCodeLocs)
+ for i in 0..<srcCodeLocs.len {
+ scl := get_rb(&srcCodeLocs, i)
+ strings.write_string(&builder, print_source_code_location_builder(scl))
+ }
+
+ log.error(strings.to_string(builder))
+
+ return windows.EXCEPTION_CONTINUE_SEARCH
+}