setAssertHandler (druntime) segfaults

Jarrett Billingsley jarrett.billingsley at gmail.com
Fri Jul 24 16:24:21 PDT 2009


On Fri, Jul 24, 2009 at 5:46 PM, Lutger<lutger.blijdestijn at gmail.com> wrote:
> Jarrett Billingsley wrote:
>
>> On Fri, Jul 24, 2009 at 4:37 PM, Lutger<lutger.blijdestijn at gmail.com>
>> wrote:
>>> There is a function setAssertHandler in druntime, but when I try to use
>>> it it segfaults. I'm not sure how it should be used, this is a complete
>>> example of what I try to do:
>>>
>>> import std.stdio;
>>> import core.exception;
>>>
>>> void handleAssertion(string file, size_t line, string msg = null)
>>> {
>>> writefln("assert in %s at line %s", file, line);
>>> };
>>>
>>> static this()
>>> {
>>> setAssertHandler( &handleAssertion  );
>>> }
>>>
>>> unittest { assert(false); }
>>>
>>> void main() {}
>>>
>>>
>>> output:
>>> assert in test at line 16
>>> Segmentation fault
>>>
>>> This is with dmd 2.031 on linux. Is this a bug, am I doing something
>>> wrong?
>>
>> Hm, it might - and I'm just taking a wild guess here - be that
>> std.stdio hasn't yet been initialized when you do the writefln in your
>> assertion handler.  But you really should try using a debugger to get
>> a stacktrace.
>
> Ok I tried. Funny thing, with -g enabled it doesn't segfault anymore.
> Without -g, the trace is not intelligible to me. Segfault also occurs when
> commenting out writefln.
>
> This is useless I assume but anyway, this is what gdb gives me:
>
> #0  0x0805292e in _TMP257 ()
> #1  0x0000000e in ?? ()
> #2  0xffffd02c in ?? ()
> #3  0x08048f79 in _D4test11__unittest1FZv ()
> Backtrace stopped: previous frame inner to this frame (corrupt stack?)

I'm.. utterly at a loss.  It seems that exiting the assertion handler
by doing anything other than throwing an exception causes the
segfault.  And like you said, -g makes the problem disappear.  I have
no idea what's going on.


More information about the Digitalmars-d-learn mailing list