I usally debug the other kind of GC problems so I'm afraid I can't
offer too many tips so here's my understanding of the intended use of
`gc_findval` without actually running the code.
When you have a value that is not being GC'd, you can interupt the
program and set the gc_findval value in the debugger (you may need to
set a breakpoint in gc.c since it is not exported, alternatively you
can DLLEXPORT that symbol or if you can turn ASLR off, you can compile
that address in directly).
The debugger should be triggered (by SIGINT on unix) on the next GC
(or you can `p jl_gc_collect(1)` to trigger one manually from gdb) and
when you look at the backtrace, you should see a series of `push_root`
and/or `gc_push_root` (depending on inlining...) the first argument
(`v`) for each of the function is the object currently being marked by
the GC and you can then trace back the object reference chain.
If the reference chain is too long, it might get pushed to the remset
(to avoid stack overflow) and you might want to break on the remset
value this time to see the complete chain.
>
> --Tim
>