improvements to GC backtrace info

This commit is contained in:
Matthew Flatt 2012-11-02 06:51:35 -06:00
parent 008f476210
commit 3ca7300a0d
2 changed files with 24 additions and 7 deletions

View File

@ -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--;
}
}

View File

@ -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