chromatic via RT wrote:
> On Friday 03 August 2007 05:15:33 Bram Geron wrote:
>
>> At Parrot exit, we force-destroy all PObjs. It can happen that a
>> context is destroyed after its sub is destroyed. Usually that's not
>> a problem, but if you run with -D80 (show when contexts are
>> destroyed, and print out the name of the sub) we may segfault,
>> because the Parrot_sub structure is already freed.
>
> That's definitely a problem, but I hate to disable tracing.
The tracing is turned off during interpreter destruction, I reckoned
that it's not necessary any more by then. All structures are going to
die anyway.
> This patch is slightly less invasive; does it solve the problem
> anyway?
No. doomed->name seems to be (STRING *) 0x0 in my test case. What would
work in my case is something like this,
fprintf(stderr, "[free ctx %p of sub '%s']\n",
(void *)ctxp,
- (doomed->name == (void*)0xdeadbeef
+ (doomed->name == (void*) 0
+ || doomed->name == (void*)0xdeadbeef
? "???"
: (char*)doomed->name->strstart));
}
but the Parrot_sub structure seems quite messed up:
{seg = 0x81d0028, start_offs = 3735928559, end_offs = 524288,
HLL_id = -559038737, namespace_name = 0x81d00d0,
namespace_stash = 0xdeadbeef, name = 0x0, vtable_index = -559038737,
multi_signature = 0x200, n_regs_used = {134722656, 136118504, 0, 1},
lex_info = 0xdeadbeef, outer_sub = 0x45400600, eval_pmc = 0x8315728,
ctx = 0x81d0100, comp_flags = 136218632, outer_ctx = 0x1}
Of these fields, [start_offs, HLL_id, namespace_stash, vtable_index,
lex_info] are 0xdeadbeef. I'd say the other fields are pretty unreliable
too. Who knows what might be in doomed->name next time?
In another test case, Parrot didn't crash. Maybe doomed->name->strstart
pointed to destroyed buffer memory, because it outputted all funny
chars. (tail:
http://vuurtje.dazjorz.com/~brammo/debug_ctx_destroy_during_cleanup.png)
The funny chars haven't been a problem, so I'd be happy with either
solution.
chromatic's patch:
> === src/gc/register.c
> ==================================================================
> --- src/gc/register.c (revision 5201)
> +++ src/gc/register.c (local)
> @@ -498,7 +498,7 @@
>
> fprintf(stderr, "[free ctx %p of sub '%s']\n",
> (void *)ctxp,
> - (doomed->name == (void*)0xdeadbeef
> + (doomed && doomed->name == (void*)0xdeadbeef
> ? "???"
> : (char*)doomed->name->strstart));
> }
--
Bram Geron | GPG 0xE7B9E65E