From 3ca7300a0dd8fde68bf551c587f911f4116034e2 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Fri, 2 Nov 2012 06:51:35 -0600 Subject: [PATCH] improvements to GC backtrace info --- src/racket/gc2/backtrace.c | 12 +++++++----- src/racket/gc2/newgc.c | 19 +++++++++++++++++-- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/racket/gc2/backtrace.c b/src/racket/gc2/backtrace.c index 7edaa15fde..dab7299429 100644 --- a/src/racket/gc2/backtrace.c +++ b/src/racket/gc2/backtrace.c @@ -39,14 +39,15 @@ static void register_traced_object(void *p) static void *print_out_pointer(const char *prefix, void *p, GC_get_type_name_proc get_type_name, - GC_print_tagged_value_proc print_tagged_value) + GC_print_tagged_value_proc print_tagged_value, + int *_kind) { trace_page_t *page; const char *what; page = pagemap_find_page(GC_instance->page_maps, p); if (!page || (trace_page_type(page) == TRACE_PAGE_BAD)) { - GCPRINT(GCOUTF, "%s??? %p\n", prefix, p); + GCPRINT(GCOUTF, "%s%s %p %p\n", prefix, trace_source_kind(*_kind), p); return NULL; } p = trace_pointer_start(page, p); @@ -80,7 +81,7 @@ static void *print_out_pointer(const char *prefix, void *p, p); } - return trace_backpointer(page, p); + return trace_backpointer(page, p, _kind); } static void print_traced_objects(int path_length_limit, @@ -98,8 +99,9 @@ static void print_traced_objects(int path_length_limit, for (i = 0; i < found_object_count; i++) { void *p; int limit = path_length_limit; + int kind = 0; p = found_objects[i]; - p = print_out_pointer("==* ", p, get_type_name, print_tagged_value); + p = print_out_pointer("==* ", p, get_type_name, print_tagged_value, &kind); j = 0; counter = 0; each = 1; while (p && limit) { @@ -121,7 +123,7 @@ static void print_traced_objects(int path_length_limit, counter = 0; } } - p = print_out_pointer(" <- ", p, get_type_name, print_tagged_value); + p = print_out_pointer(" <- ", p, get_type_name, print_tagged_value, &kind); limit--; } } diff --git a/src/racket/gc2/newgc.c b/src/racket/gc2/newgc.c index f2778db83c..b4abf7009d 100644 --- a/src/racket/gc2/newgc.c +++ b/src/racket/gc2/newgc.c @@ -1939,13 +1939,14 @@ static void copy_backtrace_source(mpage *to_page, void *to_ptr, to_page->backtrace[to_delta+1] = from_page->backtrace[from_delta+1]; } -static void *get_backtrace(mpage *page, void *ptr) +static void *get_backtrace(mpage *page, void *ptr, int *kind) /* ptr is after objhead */ { uintptr_t delta; if (!page->backtrace) { /* This shouldn't happen, but fail more gracefully if it does. */ + *kind = -1; return NULL; } @@ -1957,6 +1958,8 @@ static void *get_backtrace(mpage *page, void *ptr) } delta = PPTR(ptr) - PPTR(page->addr); + *kind = ((intptr_t *)page->backtrace)[delta]; + return page->backtrace[delta - 1]; } @@ -3406,6 +3409,17 @@ static void *trace_pointer_start(mpage *page, void *p) { # define TRACE_PAGE_BAD PAGE_TYPES # define trace_page_is_big(page) (page)->size_class # define trace_backpointer get_backtrace +const char *trace_source_kind(int kind) +{ + switch (kind) { + case BT_STACK: return "STACK"; + case BT_ROOT: return "ROOT"; + case BT_FINALIZER: return "FINALIZER"; + case BT_WEAKLINK: return "WEAK-LINK"; + case BT_IMMOBILE: return "IMMOBILE"; + default: return "???"; + } +} # include "backtrace.c" #else # define reset_object_traces() /* */ @@ -4773,8 +4787,9 @@ static GC_print_tagged_value_proc stack_print_tagged_value; static void dump_stack_pos(void *a) { + int kind = 0; GCPRINT(GCOUTF, " @%p: ", a); - print_out_pointer("", *(void **)a, stack_get_type_name, stack_print_tagged_value); + print_out_pointer("", *(void **)a, stack_get_type_name, stack_print_tagged_value, &kind); } # define GC_X_variable_stack GC_do_dump_variable_stack