helpful runtime error messages

Jonathan M Davis jmdavisProg at gmx.com
Wed Dec 15 08:37:15 PST 2010


On Wednesday 15 December 2010 02:28:56 spir wrote:
> 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?

I believe that that's pretty much what stack traces look like at this point. -gc 
is for adding debugging symbols so that you can use something like gdb, so it 
shouldn't have any effect on the stack trace. I don't think that there are any 
compiler switches that will do anything for you with regards to stack traces.

- Jonathan M Davis


More information about the Digitalmars-d-learn mailing list