[Vm-dev] Re: Ephemerons and VM crash

Guille Polito guillermopolito at gmail.com
Tue May 17 15:54:44 UTC 2016


Now we found that the stackObject becomes invalid within compact().

Before arriving to eliminateAndFreeForwardersForPigCompact() the stack 
is already invalid.

-------- Original Message --------
> Hi Eliot, list
>
> I'm working here with Pablo (Tesone) on moving forward the Ephemeron 
> implementation. We first installed Eliot's changeset, added a #mourn 
> method and an EphemeronDictionary collection, and then started testing 
> something like this:
>
> f := ObjectFinalizer receiver: 'Hello' selector: #logCr.
> d := EphemeronDictionary new.
>
> d at: f put: f.
>
> f := nil.
> Smalltalk garbageCollect.
>
>
> However, as soon as we garbage collect twice, we have a VM crash. We 
> started debugging the VM to see if we could have some more clues.
>
> The first thing we noticed is that the first time the GC runs, the 
> mournQueue is nil. This is of course expected because the new 
> finalization mechanism was not active and then there was no need to 
> create the mournQueue. We saw that the mournQueue is actually created 
> in a lazy fashion when putting queuing a mourned object (I refer 
> myself to #queueMourner: and #ensureRoomOnObjStackAt:). So the second 
> time the GC passes, the mournQueue is there. So far ok, but still 
> crashing.
>
> The crash happens in the call to
>
> markAndTraceObjStackandContents(GIV(mournQueue), 1);
>
> after the
>
>     if (!markAndTraceContents) {
>        return;
>     }
>
> But when understanding why, it starts being less clear to us :). We 
> used the printObjStack() function and we saw that:
>
> call printObjStack(markStack)
> call printObjStack(weaklingStack)
>
> and we saw in the console some output that makes sense. However, 
> printing the mournQueue in the same manner produces some strange output
>
> call printObjStack(mournQueue)
>
> head  0xb06e980 cx 18 (18) fmt 10 (10) sz 4092 (4092) myx: 4098 (4098) 
> unmkd
>     topx: 14 next:        0x0 free:        0x0
>
> We noticed that free and next are 0x0 while the others are not...
>
> Finally we saw there is isValidObjStack(), that gave us the following 
> results:
>
> call isValidObjStack(markStack) => 1
>
> call isValidObjStack(weaklingStack) => 0
> p objStackInvalidBecause = "marking but page is unmarked"
>
> call isValidObjStack(mournQueue) => 0
> p objStackInvalidBecause = "marking but page is unmarked"
>
>
> So we assume that the stack creation is wrong? We are a bit lost in here.
>
> Guille and Pablo



More information about the Vm-dev mailing list