improvements to GC backtrace info
This commit is contained in:
parent
008f476210
commit
3ca7300a0d
|
@ -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--;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue
Block a user