<div>Here is |dig-out-gc-roots-graph|, a routine for digging out the GC roots for a given object.</div><div><br></div><div>As potentially the depth to the deepest root can be really deep and each resolve operation takes one full GC to perform which can take seconds, the probing is done one level of depth at a time rather than through ordinary tree recursion, and after each probe the complete result up to that point is printed out.</div>



<div><br></div><div><div> ** BETA NOTICE: |dig-out-gc-roots-graph| works well enough for my current use though there is a stability issue about |dig-out-gc-roots-graph| or |##resolve-referencing-objects| addressed in the next email - <u>this version tends to crash Gambit during GC</u> after having worked itself some levels into the graph.</div>

</div><div><br></div><div>At least if it will become perfectly stable, this will be released on the dumping grounds and then as a module file in a repo or alike at some future point in time.</div><div><br></div><div><b>Usage example 1:</b></div>

<div><br></div>
<div>
<blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><div><font face="courier new, monospace">> (dig-out-gc-roots-graph '(1 2 3))</font></div><div><font face="courier new, monospace">Digging out the GC roots for object #2...</font></div>



<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">References to object #2:</font></div><div><font face="courier new, monospace">#2</font></div><div><font face="courier new, monospace">  (Unknown root)</font></div>



<div><font face="courier new, monospace">  #3 (In work queue)</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">References to object #2:</font></div><div><font face="courier new, monospace">#2</font></div>



<div><font face="courier new, monospace">  (Unknown root)</font></div><div><font face="courier new, monospace">  #3</font></div><div><font face="courier new, monospace">    (Unknown root)</font></div><div><font face="courier new, monospace">    #4 (In work queue)</font></div>



<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">References to object #2:</font></div><div><font face="courier new, monospace">#2</font></div><div><font face="courier new, monospace">  (Unknown root)</font></div>



<div><font face="courier new, monospace">  #3</font></div><div><font face="courier new, monospace">    (Unknown root)</font></div><div><font face="courier new, monospace">    #4</font></div><div><font face="courier new, monospace">      (Unknown root)</font></div>



<div><font face="courier new, monospace">      #3 (In work queue)</font></div><div><font face="courier new, monospace">      #5 (In work queue)</font></div><div><font face="courier new, monospace">      #6 (In work queue)</font></div>



<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">References to object #2:</font></div><div><font face="courier new, monospace">#2</font></div><div><font face="courier new, monospace">  (Unknown root)</font></div>



<div><font face="courier new, monospace">  #3</font></div><div><font face="courier new, monospace">    (Unknown root)</font></div><div><font face="courier new, monospace">    #4</font></div><div><font face="courier new, monospace">      (Unknown root)</font></div>



<div><font face="courier new, monospace">      #3 (In work queue)</font></div><div><font face="courier new, monospace">      #5 (In work queue)</font></div><div><font face="courier new, monospace">      #6</font></div><div>



<font face="courier new, monospace">        (Unknown root)</font></div><div><font face="courier new, monospace">        #4 (In work queue)</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">References to object #2:</font></div>



<div><font face="courier new, monospace">#2</font></div><div><font face="courier new, monospace">  (Unknown root)</font></div><div><font face="courier new, monospace">  #3</font></div><div><font face="courier new, monospace">    (Unknown root)</font></div>



<div><font face="courier new, monospace">    #4</font></div><div><font face="courier new, monospace">      (Unknown root)</font></div><div><font face="courier new, monospace">      #3 (In work queue)</font></div><div><font face="courier new, monospace">      #5</font></div>



<div><font face="courier new, monospace">        (Unknown root)</font></div><div><font face="courier new, monospace">      #6</font></div><div><font face="courier new, monospace">        (Unknown root)</font></div><div><font face="courier new, monospace">        #4 (In work queue)</font></div>



<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">References to object #2:</font></div><div><font face="courier new, monospace">#2</font></div><div><font face="courier new, monospace">  (Unknown root)</font></div>



<div><font face="courier new, monospace">  #3</font></div><div><font face="courier new, monospace">    (Unknown root)</font></div><div><font face="courier new, monospace">    #4</font></div><div><font face="courier new, monospace">      (Unknown root)</font></div>



<div><font face="courier new, monospace">      #3 (This object was already found at a lower depth in the graph.)</font></div><div><font face="courier new, monospace">      #5</font></div><div><font face="courier new, monospace">        (Unknown root)</font></div>



<div><font face="courier new, monospace">      #6</font></div><div><font face="courier new, monospace">        (Unknown root)</font></div><div><font face="courier new, monospace">        #4 (In work queue)</font></div><div>



<font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">References to object #2:</font></div><div><font face="courier new, monospace">#2</font></div><div><font face="courier new, monospace">  (Unknown root)</font></div>



<div><font face="courier new, monospace">  #3</font></div><div><font face="courier new, monospace">    (Unknown root)</font></div><div><font face="courier new, monospace">    #4</font></div><div><font face="courier new, monospace">      (Unknown root)</font></div>



<div><font face="courier new, monospace">      #3 (This object was already found at a lower depth in the graph.)</font></div><div><font face="courier new, monospace">      #5</font></div><div><font face="courier new, monospace">        (Unknown root)</font></div>



<div><font face="courier new, monospace">      #6</font></div><div><font face="courier new, monospace">        (Unknown root)</font></div><div><font face="courier new, monospace">        #4 (This object was already found at a lower depth in the graph.)</font></div>



<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">Done!</font></div><div><font face="courier new, monospace">All the objects that refer to this object in total (+ the object itself) are: #5 #4 #6 #2 #3</font></div>



<div><font face="courier new, monospace">All the objects that refer to this object closest to the root in total are: #5</font></div></div><div><font face="courier new, monospace">> #3</font></div><div><font face="courier new, monospace">#(#(#f</font></div>



<div><font face="courier new, monospace">    #<procedure #4 ##cprc-app1-sub></font></div><div><font face="courier new, monospace">    #(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#( [...]</font></div></blockquote>



</div><div><br></div><div>"(Unknown root)" should be the interpreter's reference accessible as the # variable in the REPL.</div><div><br></div><div><div>#3 must be some structure created by the interpreter, and so are the objects that reference it in turn (i.e. #4, #5 & #6). Curious what they are about?</div>



<div><br></div></div><div><br></div><div><b>Usage example 2:</b></div><div><br></div><div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><div><font face="courier new, monospace">> (define a "Hello world")</font></div>



<div><font face="courier new, monospace">> (define b (list a a))</font></div><div><font face="courier new, monospace">> (define c (list b b))</font></div><div><font face="courier new, monospace">> (dig-out-gc-roots-graph a)</font></div>



<div><font face="courier new, monospace">Digging out the GC roots for object #2...</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">References to object #2:</font></div>



<div><font face="courier new, monospace">#2</font></div><div><font face="courier new, monospace">  (Unknown root)</font></div><div><font face="courier new, monospace">  #3 (In work queue)</font></div><div><font face="courier new, monospace">  #4 (In work queue)</font></div>



<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">References to object #2:</font></div><div><font face="courier new, monospace">#2</font></div><div><font face="courier new, monospace">  (Unknown root)</font></div>



<div><font face="courier new, monospace">  #3 (In work queue)</font></div><div><font face="courier new, monospace">  #4</font></div><div><font face="courier new, monospace">    (Unknown root)</font></div><div><font face="courier new, monospace">    #5 (In work queue)</font></div>



<div><font face="courier new, monospace">    #6 (In work queue)</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">References to object #2:</font></div><div><font face="courier new, monospace">#2</font></div>



<div><font face="courier new, monospace">  (Unknown root)</font></div><div><font face="courier new, monospace">  #3</font></div><div><font face="courier new, monospace">    (Unknown root)</font></div><div><font face="courier new, monospace">    #4 (In work queue)</font></div>



<div><font face="courier new, monospace">  #4</font></div><div><font face="courier new, monospace">    (Unknown root)</font></div><div><font face="courier new, monospace">    #5 (In work queue)</font></div><div><font face="courier new, monospace">    #6 (In work queue)</font></div>



<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">References to object #2:</font></div><div><font face="courier new, monospace">#2</font></div><div><font face="courier new, monospace">  (Unknown root)</font></div>



<div><font face="courier new, monospace">  #3</font></div><div><font face="courier new, monospace">    (Unknown root)</font></div><div><font face="courier new, monospace">    #4 (In work queue)</font></div><div><font face="courier new, monospace">  #4</font></div>



<div><font face="courier new, monospace">    (Unknown root)</font></div><div><font face="courier new, monospace">    #5 (In work queue)</font></div><div><font face="courier new, monospace">    #6</font></div><div><font face="courier new, monospace">      (Unknown root)</font></div>



<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">References to object #2:</font></div><div><font face="courier new, monospace">#2</font></div><div><font face="courier new, monospace">  (Unknown root)</font></div>



<div><font face="courier new, monospace">  #3</font></div><div><font face="courier new, monospace">    (Unknown root)</font></div><div><font face="courier new, monospace">    #4 (In work queue)</font></div><div><font face="courier new, monospace">  #4</font></div>



<div><font face="courier new, monospace">    (Unknown root)</font></div><div><font face="courier new, monospace">    #5</font></div><div><font face="courier new, monospace">      (Unknown root)</font></div><div><font face="courier new, monospace">      #6 (In work queue)</font></div>



<div><font face="courier new, monospace">    #6</font></div><div><font face="courier new, monospace">      (Unknown root)</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">References to object #2:</font></div>



<div><font face="courier new, monospace">#2</font></div><div><font face="courier new, monospace">  (Unknown root)</font></div><div><font face="courier new, monospace">  #3</font></div><div><font face="courier new, monospace">    (Unknown root)</font></div>



<div><font face="courier new, monospace">    #4 (This object was already found at a lower depth in the graph.)</font></div><div><font face="courier new, monospace">  #4</font></div><div><font face="courier new, monospace">    (Unknown root)</font></div>



<div><font face="courier new, monospace">    #5</font></div><div><font face="courier new, monospace">      (Unknown root)</font></div><div><font face="courier new, monospace">      #6 (In work queue)</font></div><div><font face="courier new, monospace">    #6</font></div>



<div><font face="courier new, monospace">      (Unknown root)</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">References to object #2:</font></div><div><font face="courier new, monospace">#2</font></div>



<div><font face="courier new, monospace">  (Unknown root)</font></div><div><font face="courier new, monospace">  #3</font></div><div><font face="courier new, monospace">    (Unknown root)</font></div><div><font face="courier new, monospace">    #4 (This object was already found at a lower depth in the graph.)</font></div>



<div><font face="courier new, monospace">  #4</font></div><div><font face="courier new, monospace">    (Unknown root)</font></div><div><font face="courier new, monospace">    #5</font></div><div><font face="courier new, monospace">      (Unknown root)</font></div>



<div><font face="courier new, monospace">      #6 (This object was already found at a lower depth in the graph.)</font></div><div><font face="courier new, monospace">    #6</font></div><div><font face="courier new, monospace">      (Unknown root)</font></div>



<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">Done!</font></div><div><font face="courier new, monospace">All the objects that refer to this object in total (+ the object itself) are: #3 #2 #4 #6 #5</font></div>



<div><font face="courier new, monospace">All the objects that refer to this object closest to the root in total are: #6</font></div></div><div><div><font face="courier new, monospace">> (object->serial-number a)</font></div>



<div><font face="courier new, monospace">2</font></div><div><font face="courier new, monospace">> (object->serial-number b)</font></div><div><font face="courier new, monospace">4</font></div><div><font face="courier new, monospace">> (object->serial-number (cdr b))</font></div>



<div><font face="courier new, monospace">3</font></div><div><font face="courier new, monospace">> (object->serial-number c)</font></div><div><font face="courier new, monospace">6</font></div><div><font face="courier new, monospace">> (object->serial-number (cdr c))</font></div>



<div><font face="courier new, monospace">5</font></div></div></blockquote></div><div><br></div><div>"(Unknown root)" are either the global object reference (this is the case for the reports of #2, #4 and #6), or some other reference that Gambit holds - that would be the reports for #3 and #5, would be curious to know what they are!</div>



<div><br></div><div><b>Usage example 3:</b></div><div><br></div><div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><div><font face="courier new, monospace">> (define a "Obj")</font></div>


<div><font face="courier new, monospace">> (define b (make-will a (lambda (v) (void))))</font></div><div><font face="courier new, monospace">> (dig-out-gc-roots-graph a)</font></div><div><font face="courier new, monospace">Digging out the GC roots for object #2...</font></div>


<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">References to object #2:</font></div><div><font face="courier new, monospace">#2</font></div><div><font face="courier new, monospace">  (Unknown root)</font></div>


<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">Done!</font></div><div><font face="courier new, monospace">All the objects that refer to this object in total (+ the object itself) are: #2</font></div>


<div><font face="courier new, monospace">All the objects that refer to this object closest to the root in total are: #2</font></div></div></blockquote></div><div><br></div><div>Weak references are not covered, as it should be.</div>


<div><br></div><div><br></div><div><b>Files & notes</b></div><div>First, attached the latest Gambit commit's (ffd839c64f66278cdb4cce5ef86316ee290a4204) files patched with ##resolve-referencing-objects support.</div>


<div><br></div>
<div>Next, dig-out-gc-roots-graph.scm containing |dig-out-gc-roots-graph| .</div><div><br></div><div>For |dig-out-gc-roots-graph| to work, dig-out-gc-roots-graph.scm must be in compiled mode, otherwise it produces an infinite amount of yet-another-referencing-object.</div>



<div><br></div><div><br></div>