and in fact the issue is an infinite recursion in Nautilus class&gt;groupsManager:<div><br></div><div><div>0xbff5ead0 M Nautilus class&gt;groupsManager 363174868: a(n) Nautilus class</div><div>0xbff5eae8 M Nautilus&gt;groupsManager 397856104: a(n) Nautilus</div>

<div>0xbff5eb00 M NautilusUI(AbstractNautilusUI)&gt;groupsManager 397856244: a(n) NautilusUI</div><div>0xbff5eb1c M NautilusUI(AbstractNautilusUI)&gt;aGroupHasBeenAdded: 397856244: a(n) NautilusUI</div><div>0xbff5eb38 M WeakMessageSend&gt;value: 397858000: a(n) WeakMessageSend</div>

<div>0xbff5eb54 M WeakMessageSend&gt;cull: 397858000: a(n) WeakMessageSend</div><div>0xbff5eb70 M WeakMessageSend&gt;cull:cull: 397858000: a(n) WeakMessageSend</div><div>0xbff5eb94 M [] in WeakAnnouncementSubscription&gt;deliver: 397858036: a(n) WeakAnnouncementSubscription</div>

<div>0xbff5ebb0 M BlockClosure&gt;on:do: 402448660: a(n) BlockClosure</div><div>0xbff5ebd0 M BlockClosure&gt;on:fork: 402448660: a(n) BlockClosure</div><div>0xbff5ebf0 M WeakAnnouncementSubscription&gt;deliver: 397858036: a(n) WeakAnnouncementSubscription</div>

<div>0xbff5ec14 M [] in SubscriptionRegistry&gt;deliver:to: 363283080: a(n) SubscriptionRegistry</div><div>0xbff5ec34 M BlockClosure&gt;ifCurtailed: 402448516: a(n) BlockClosure</div><div>0xbff5ec58 M [] in SubscriptionRegistry&gt;deliver:to: 363283080: a(n) SubscriptionRegistry</div>

<div>0xbff5ec78 M OrderedCollection&gt;do: 402427332: a(n) OrderedCollection</div><div>0xbff5ec94 M SubscriptionRegistry&gt;deliver:to: 363283080: a(n) SubscriptionRegistry</div><div>0xbff5ecb8 M SubscriptionRegistry&gt;deliver: 363283080: a(n) SubscriptionRegistry</div>

<div>0xbff5ecd8 M Announcer&gt;announce: 363283068: a(n) Announcer</div><div>0xbff5ecf8 M GroupsHolder&gt;addADynamicClassGroupSilentlyNamed:block: 402407104: a(n) GroupsHolder</div><div>0xbff5ed1c M Nautilus class&gt;buildGroupManager 363174868: a(n) Nautilus class</div>

<div>0xbff5ed34 M Nautilus class&gt;groupsManager 363174868: a(n) Nautilus class</div><div>0xbff5ed4c M Nautilus&gt;groupsManager 397856104: a(n) Nautilus</div><div><br></div><br><div class="gmail_quote">On Mon, Feb 27, 2012 at 1:15 PM, Eliot Miranda <span dir="ltr">&lt;<a href="mailto:eliot.miranda@gmail.com" target="_blank">eliot.miranda@gmail.com</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">let me retry *with* the attachment :(<br><br><div class="gmail_quote"><div>On Mon, Feb 27, 2012 at 12:03 PM, Igor Stasenko <span dir="ltr">&lt;<a href="mailto:siguctua@gmail.com" target="_blank">siguctua@gmail.com</a>&gt;</span> wrote:<br>

</div><div><div></div><div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div><div></div><div>On 27 February 2012 10:53, Mariano Martinez Peck &lt;<a href="mailto:marianopeck@gmail.com" target="_blank">marianopeck@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; On Mon, Feb 27, 2012 at 5:20 AM, Eliot Miranda &lt;<a href="mailto:eliot.miranda@gmail.com" target="_blank">eliot.miranda@gmail.com</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; Hi Mariano,<br>
&gt;&gt;<br>
&gt;&gt; On Sun, Feb 26, 2012 at 8:58 AM, Mariano Martinez Peck &lt;<a href="mailto:marianopeck@gmail.com" target="_blank">marianopeck@gmail.com</a>&gt; wrote:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Hi. I have faced a VM crash while using Nautilus browser. It took me a while, but I finally could make a reproducible crash from image startup. You can find the image here:<br>
&gt;&gt;&gt; <a href="https://gforge.inria.fr/frs/download.php/30280/Marea.104-Crash.1.image.zip" target="_blank">https://gforge.inria.fr/frs/download.php/30280/Marea.104-Crash.1.image.zip</a><br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; What the image is running at startup that causes the crash is:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; | nautilus model ui|<br>
&gt;&gt;&gt; Nautilus instVarNamed: &#39;groups&#39; put: nil.<br>
&gt;&gt;&gt; model := Nautilus open.<br>
&gt;&gt;&gt; ui := model ui.<br>
&gt;&gt;&gt; ui groupsButtonAction.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; If you need more about the &quot;domain&quot;, we can ask Ben, Nautilus developer.  From what I can see in GDB, it crashes in #mapStackPages  because it does a remap to an OOP that is 0 (zero)<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; while (theSP &lt;= frameRcvrOffset) {<br>
&gt;&gt;&gt;                     oop = longAt(theSP);<br>
&gt;&gt;&gt;                     if (!((oop &amp; 1))) {<br>
&gt;&gt;&gt;                         longAtput(theSP, remap(oop));<br>
&gt;&gt;&gt;                     }<br>
&gt;&gt;&gt;                     theSP += BytesPerWord;<br>
&gt;&gt;&gt;                 }<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Any ideas?<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; The image overflows the weakRoots table in scanning stack pages.  The weakRoots table registers weak objects for scanning at the end of a GC.  It is, unfortunately, fixed size (~2600 entries), and there are lots of WeakMessageSends and WeakAnnouncementSubscriptions on the stack.<br>



&gt;&gt;<br>
&gt;&gt; I found this using aDebug VM with assert enabled (i.e. compiled with NDEBUG /not/ defined).  I increased the table size to 3000 then 6000 before finding it no longer crashed with a weakRoots  table size of 12000.<br>



&gt;&gt;<br>
&gt;<br>
&gt; wow, I never imagine about that.<br>
&gt;<br>
&gt;&gt;<br>
&gt;&gt; a) Looks like weakRoots&#39; size should be configurable either via a start-up flag or an image header constant (with e.g. vmParameter accessors).<br>
&gt;<br>
&gt;<br>
&gt; yes, with vmParameter would be nice, like the external semaphore table.<br>
&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; b) overflowing the weakRoots table (and possibly other tables) should probably cause the VM to abort with a useful error message.<br>
&gt;&gt;<br>
&gt;<br>
&gt; please!  :)<br>
&gt;<br>
&gt; I have check in the image, before reproducing the bug, and it is not that bad:<br>
&gt;<br>
&gt; WeakMessageSend instanceCount 755.<br>
&gt; WeakAnnouncementSubscription instanceCount 538<br>
&gt;<br>
&gt; So...maybe when I do the stuff that reproduces the crash there is ANOTHER bug (say a loop for example), that cause to have much more instances of those weak stuff?<br>
&gt;<br>
&gt;<br>
</div></div>hmm.. i hardly believe that UI needs such amount of weak messages to<br>
wire the stuff.. but it is hard to tell, since i&#39;m not an author.<br></blockquote><div><br></div><div><br></div></div></div><div><span style="border-collapse:collapse;font-family:arial,sans-serif;font-size:13px"><div>


Take a look at the attached.  It is taken form the image at a point where an incrementalGC is performed when the weakRootTable has 6000 or more elements.  It shows a very deep call stack full of WeakAnnouncementSubscriptions.</div>


<div style="color:rgb(80,0,80)"></div></span><div><br></div><div> </div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Also, answering Stephane&#39;s question: AFAIK, a weak roots table size is<div>

<br>

not liearly depending on the total number of all weak containers in<br>
your image.<br></div></blockquote><div><br></div><div>The number of weak containers does define an upper bound on the size of the table.  It doesn&#39;t necessarily correlate to how many containers are encountered in an incremental GC.</div>

<div>
<div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
But i might be wrong.<br>
Eliot, can you please explain how this weak roots table populated and<br>
what triggers addition of new element(s) to it, and freeing the entry.<br></blockquote><div><br></div></div><div><span style="border-collapse:collapse;font-family:arial,sans-serif;font-size:13px"><div style="color:rgb(80,0,80)">


<div><br></div></div><div>So when an incremental GC is performed, any weak collections encountered must be scanned later, after the mark phase of non-objects have completed, so that the GC can discover which elements of weak collections are unmarked and nil these collections.  So in markAndTrace any encountered weak objects get added as &quot;roots&quot; to the weakRootsTable.  Later (either in incrementalGC or fullGC) the weak table is processed and unmarked referents in the weak arrays in the weak table are nilled.  Hence the weak table fills during the mark phase and is emptied in the nilling phase.</div>


<div><br></div><div>But in reading the code more carefully I notice that the weak roots table is not used during a full GC.  Instead, during a fullGC nilling is done as each weak container is encountered.  I don&#39;t understand how this works yet.  Anyone care to explain?</div>


</span></div><div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
And is the weak roots table size limit reasonably good? Needless to<br>
say, that nobody likes when system hits the wall of hardcoded limits.<br></blockquote><div><br></div><div><br></div></div><div><span style="border-collapse:collapse;font-family:arial,sans-serif;font-size:13px">Hmmm... In VisualWorks, which has a two-space copying generational GC there is no weak root table during incremental GC.  Instead the list of weak objects is threaded through the corpses left behind in from space.  So at least for some GC designs a weak roots table isn&#39;t even needed.  I will copy this scheme in my new object representation/GC.  But for now I think just providing a parameter to determine the maximum size is sufficient.</span></div>

<div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<font color="#888888"><br>
--<br>
Best regards,<br>
Igor Stasenko.<br>
</font></blockquote></div></div><font color="#888888"><br><br clear="all"><div><br></div>-- <br>best,<div>Eliot</div><br>
</font></blockquote></div><br><br clear="all"><div><br></div>-- <br>best,<div>Eliot</div><br>
</div>