helpful runtime error messages

spir denis.spir at gmail.com
Wed Dec 15 02:28:56 PST 2010


On Tue, 14 Dec 2010 10:13:03 -0800
Jonathan M Davis <jmdavisProg at gmx.com> wrote:

> On Tuesday, December 14, 2010 09:48:14 spir wrote:
> > Hello,
> > 
> > 
> > Am I the only one who gets, as only kind of runtime errors, spectacularly
> > helpful messages like:
> > 
> > int f () {return 0;}
> > void main () {
> >     assert (f() == 1);
> > }
> > ==>
> > spir at o:~/prog/d/Text$ ./__trials__
> > core.exception.AssertError at __trials__(44): Assertion failure
> > ----------------
> > ./__trials__() [0x804bb86]
> > ./__trials__() [0x8049642]
> > ./__trials__() [0x804960b]
> > ./__trials__() [0x804bd76]
> > ./__trials__() [0x804bcd0]
> > ./__trials__() [0x804bdba]
> > ./__trials__() [0x804bcd0]
> > ./__trials__() [0x804bc76]
> > /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6) [0x292bd6]
> > 
> > Thankfully, D is a static language, so that I have rather few runtime
> > errors. But what am I missing to get a stack trace? Sometimes, I don't
> > even have the (last) faulty line of code (dunno why).
> 
> On Linux, I believe that you need to compile with -L--export-dynamic. I think 
> that that's supposed to be in the version of dmd.conf that comes with the most 
> recent version of dmd, so it should work out of the box (though if you're using 
> an older dmd.conf, then it would be missing). IIRC, stack traces don't work 
> properly on Windows yet (though I don't know exactly what's going on there), so 
> I believe that you're currently out of luck on Windows. However, what you're 
> showing there looks like what you get on Linux if you don't build with -L--
> export-dynamic, so I'm guessing that that's your problem.
> 
> - Jonathan M Davis

Thank you, jonathan. (On Linux, yes) I get now for a prog called "x.d":

spir at o:~/prog/d$ dmd -ofprog -w -debug -unittest -L--export-dynamic prog.d
spir at o:~/prog/d$ ./prog
core.exception.AssertError at prog(20): Assertion failure
----------------
./prog(_d_assertm+0x16) [0x807ca26]
./prog(void prog.__assert(int)) [0x807a4ea]
./prog(_Dmain+0x17) [0x807a4d3]
./prog(extern (C) int rt.dmain2.main(int, char**)) [0x807cc16]
./prog(extern (C) int rt.dmain2.main(int, char**)) [0x807cb70]
./prog(extern (C) int rt.dmain2.main(int, char**)) [0x807cc5a]
./prog(extern (C) int rt.dmain2.main(int, char**)) [0x807cb70]
./prog(main+0x96) [0x807cb16]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6) [0x23bbd6]
./prog() [0x807a3f1]

Much better (if not the friendliest output I've ever seen ;-).

For the following prog, I get:

int element(int[] elements, uint i) {return elements[i];}
void main () {
    int[] elements = [3,2,1];
    auto e = elements[9];
}

spir at o:~/prog/d$ dmd -ofprog -w -debug -unittest -L--export-dynamic prog.d
spir at o:~/prog/d$ ./prog
core.exception.RangeError at prog(20): Range violation
----------------
./prog(_d_array_bounds+0x16) [0x807cad6]
./prog(_D4prog7__arrayZ+0x12) [0x807a54a]
./prog(_Dmain+0x38) [0x807a524]
./prog(extern (C) int rt.dmain2.main(int, char**)) [0x807cc76]
./prog(extern (C) int rt.dmain2.main(int, char**)) [0x807cbd0]
./prog(extern (C) int rt.dmain2.main(int, char**)) [0x807ccba]
./prog(extern (C) int rt.dmain2.main(int, char**)) [0x807cbd0]
./prog(main+0x96) [0x807cb76]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6) [0x1ddbd6]
./prog() [0x807a401]

Do you have (even) nicer error reports on some OS's or using some switches?


denis
-- -- -- -- -- -- --
vit esse estrany ☣

spir.wikidot.com



More information about the Digitalmars-d-learn mailing list