|
@@ -0,0 +1,50 @@
|
|
|
+/*
|
|
|
+A debug stack trace library. Only works when debug symbols are enabled `-debug`.
|
|
|
+
|
|
|
+Example:
|
|
|
+ import "base:runtime"
|
|
|
+ import "core:debug/trace"
|
|
|
+
|
|
|
+ import "core:fmt"
|
|
|
+
|
|
|
+ global_trace_ctx: trace.Context
|
|
|
+
|
|
|
+ debug_trace_assertion_failure_proc :: proc(prefix, message: string, loc := #caller_location) -> ! {
|
|
|
+ runtime.print_caller_location(loc)
|
|
|
+ runtime.print_string(" ")
|
|
|
+ runtime.print_string(prefix)
|
|
|
+ if len(message) > 0 {
|
|
|
+ runtime.print_string(": ")
|
|
|
+ runtime.print_string(message)
|
|
|
+ }
|
|
|
+ runtime.print_byte('\n')
|
|
|
+
|
|
|
+ ctx := &global_trace_ctx
|
|
|
+ if !trace.in_resolve(ctx) {
|
|
|
+ runtime.print_string("Debug Trace:\n")
|
|
|
+ frames := trace.frames(ctx, skip=1, allocator=context.temp_allocator)
|
|
|
+ for f, i in frames {
|
|
|
+ fl := trace.resolve(ctx, f, context.temp_allocator)
|
|
|
+ if fl.loc.file_path == "" && fl.loc.line == 0 {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ runtime.print_caller_location(fl.loc)
|
|
|
+ runtime.print_string(" - frame ")
|
|
|
+ runtime.print_int(i)
|
|
|
+ runtime.print_byte('\n')
|
|
|
+ }
|
|
|
+ }
|
|
|
+ runtime.trap()
|
|
|
+ }
|
|
|
+
|
|
|
+ main :: proc() {
|
|
|
+ trace.init(&global_trace_ctx)
|
|
|
+ defer trace.destroy(&global_trace_ctx)
|
|
|
+
|
|
|
+ context.assertion_failure_proc = debug_trace_assertion_failure_proc
|
|
|
+
|
|
|
+ ...
|
|
|
+ }
|
|
|
+
|
|
|
+*/
|
|
|
+package debug_trace
|