GC: improve backtrace info for 'interior pointers
This commit is contained in:
parent
84bffd41af
commit
ddd4190edf
|
@ -50,6 +50,7 @@ static void *print_out_pointer(const char *prefix, void *p,
|
||||||
GC_print_tagged_value_proc print_tagged_value,
|
GC_print_tagged_value_proc print_tagged_value,
|
||||||
int *_kind)
|
int *_kind)
|
||||||
{
|
{
|
||||||
|
void *orig_p;
|
||||||
trace_page_t *page;
|
trace_page_t *page;
|
||||||
const char *what;
|
const char *what;
|
||||||
|
|
||||||
|
@ -58,10 +59,13 @@ static void *print_out_pointer(const char *prefix, void *p,
|
||||||
GCPRINT(GCOUTF, "%s%s %p\n", prefix, trace_source_kind(*_kind), p);
|
GCPRINT(GCOUTF, "%s%s %p\n", prefix, trace_source_kind(*_kind), p);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
orig_p = p;
|
||||||
p = trace_pointer_start(page, p);
|
p = trace_pointer_start(page, p);
|
||||||
|
|
||||||
if ((trace_page_type(page) == TRACE_PAGE_TAGGED)
|
if ((trace_page_type(page) == TRACE_PAGE_TAGGED)
|
||||||
|| (trace_page_type(page) == TRACE_PAGE_PAIR)) {
|
|| (trace_page_type(page) == TRACE_PAGE_PAIR)
|
||||||
|
|| ((trace_page_type(page) == TRACE_PAGE_MED_NONATOMIC)
|
||||||
|
&& (OBJPTR_TO_OBJHEAD(p)->type == PAGE_TAGGED))) {
|
||||||
Type_Tag tag;
|
Type_Tag tag;
|
||||||
tag = *(Type_Tag *)p;
|
tag = *(Type_Tag *)p;
|
||||||
if ((tag >= 0) && get_type_name && get_type_name(tag)) {
|
if ((tag >= 0) && get_type_name && get_type_name(tag)) {
|
||||||
|
@ -72,8 +76,19 @@ static void *print_out_pointer(const char *prefix, void *p,
|
||||||
what = NULL;
|
what = NULL;
|
||||||
} else if (trace_page_type(page) == TRACE_PAGE_ARRAY) {
|
} else if (trace_page_type(page) == TRACE_PAGE_ARRAY) {
|
||||||
what = "ARRAY";
|
what = "ARRAY";
|
||||||
|
} else if ((trace_page_type(page) == TRACE_PAGE_MED_NONATOMIC)
|
||||||
|
&& (OBJPTR_TO_OBJHEAD(p)->type == PAGE_ARRAY)) {
|
||||||
|
what = "MED_ARRAY";
|
||||||
|
if (p != orig_p) {
|
||||||
|
GCPRINT(GCOUTF, "%s%s %p as %p\n", prefix, what, p, orig_p);
|
||||||
|
what = NULL;
|
||||||
|
}
|
||||||
} else if (trace_page_type(page) == TRACE_PAGE_ATOMIC) {
|
} else if (trace_page_type(page) == TRACE_PAGE_ATOMIC) {
|
||||||
what = "ATOMIC";
|
what = "ATOMIC";
|
||||||
|
} else if (trace_page_type(page) == TRACE_PAGE_MED_ATOMIC) {
|
||||||
|
what = "MED_ATOMIC";
|
||||||
|
} else if (trace_page_type(page) == TRACE_PAGE_MED_NONATOMIC) {
|
||||||
|
what = "MED_NONATOMIC";
|
||||||
} else if (trace_page_type(page) == TRACE_PAGE_MALLOCFREE) {
|
} else if (trace_page_type(page) == TRACE_PAGE_MALLOCFREE) {
|
||||||
what = "MALLOCED";
|
what = "MALLOCED";
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -5883,6 +5883,8 @@ static void *trace_pointer_start(mpage *page, void *p) {
|
||||||
# define TRACE_PAGE_ATOMIC PAGE_ATOMIC
|
# define TRACE_PAGE_ATOMIC PAGE_ATOMIC
|
||||||
# define TRACE_PAGE_PAIR PAGE_PAIR
|
# define TRACE_PAGE_PAIR PAGE_PAIR
|
||||||
# define TRACE_PAGE_MALLOCFREE PAGE_TYPES
|
# define TRACE_PAGE_MALLOCFREE PAGE_TYPES
|
||||||
|
# define TRACE_PAGE_MED_ATOMIC PAGE_MED_ATOMIC
|
||||||
|
# define TRACE_PAGE_MED_NONATOMIC PAGE_MED_NONATOMIC
|
||||||
# define TRACE_PAGE_BAD PAGE_TYPES
|
# define TRACE_PAGE_BAD PAGE_TYPES
|
||||||
# define trace_page_is_big(page) ((page)->size_class >= SIZE_CLASS_BIG_PAGE)
|
# define trace_page_is_big(page) ((page)->size_class >= SIZE_CLASS_BIG_PAGE)
|
||||||
# define trace_backpointer get_backtrace
|
# define trace_backpointer get_backtrace
|
||||||
|
|
Loading…
Reference in New Issue
Block a user