From 24e353ded2fce5c8293a1efb3fb9688b807d91f1 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Fri, 17 Jun 2016 06:44:15 -0700 Subject: Print valgrind backtraces for break_obj. * gc.c (more): Under EXTRA_DEBUGGING, call breakpt() here also, when it is detected that break_obj is added to the free list for the firts time. Print a message and backtrace using VALGRIND_PRINTF_BACKTRACE. (make_obj): Likewise, for an object that is pulled out of the free list and returned. (mark_obj, sweep_one): Print backtrace with Valgrind for break_obj, in addition to calling breakpt(). --- gc.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/gc.c b/gc.c index f82ec5f0..cc5c0f37 100644 --- a/gc.c +++ b/gc.c @@ -142,6 +142,14 @@ static void more(void) while (block < end) { block->t.next = free_list; block->t.type = convert(type_t, FREE); +#if EXTRA_DEBUGGING + if (block == break_obj) { +#if HAVE_VALGRIND + VALGRIND_PRINTF_BACKTRACE("object %p newly added to free list\n", convert(void *, block)); +#endif + breakpt(); + } +#endif free_list = block++; } @@ -198,6 +206,14 @@ val make_obj(void) freshobj[freshobj_idx++] = ret; #endif gc_bytes += sizeof (obj_t); +#if EXTRA_DEBUGGING + if (ret == break_obj) { +#if HAVE_VALGRIND + VALGRIND_PRINTF_BACKTRACE("object %p allocated\n", convert(void *, ret)); +#endif + breakpt(); + } +#endif return ret; } @@ -311,8 +327,12 @@ tail_call: obj->t.type = convert(type_t, t | REACHABLE); #if EXTRA_DEBUGGING - if (obj == break_obj) + if (obj == break_obj) { +#if HAVE_VALGRIND + VALGRIND_PRINTF_BACKTRACE("object %p marked\n", convert(void *, obj)); +#endif breakpt(); + } #endif switch (t) { @@ -478,8 +498,14 @@ static int sweep_one(obj_t *block) #endif #if EXTRA_DEBUGGING - if (block == break_obj) + if (block == break_obj) { +#if HAVE_VALGRIND + VALGRIND_PRINTF_BACKTRACE("object %p swept (type = %x)\n", + convert(void *, block), + convert(unsigned int, block->t.type)); +#endif breakpt(); + } #endif #if CONFIG_GEN_GC -- cgit v1.2.3