segfault
Steven Schveighoffer
schveiguy at yahoo.com
Thu Nov 11 07:52:50 PST 2010
On Thu, 11 Nov 2010 10:34:41 -0500, spir <denis.spir at gmail.com> wrote:
> On Thu, 11 Nov 2010 07:47:01 -0500
> "Steven Schveighoffer" <schveiguy at yahoo.com> wrote:
>
>> This is not enough code to understand the problem. For instance,
>> writefln(pattern) prints a class, but we don't see Pattern's toString
>> function. We don't see the code that creates the object and then calls
>> check. Maybe something happens between calls?
>>
>> It's impossible to diagnose something like this without a working
>> example,
>> so you need to trim it down to something that still compiles and fails,
>> and then share that entire code.
>>
>> -Steve
>
> Hello,
>
> I tried to build a example mini-app to show the issue more simply, but
> couldn't. The point is the bug only shows when using the most
> complicated element of my code (class List), built on top of ~ 1000
> lines. I guess the best is to try to explain the case and provide
> example test. See code of the class and test case below.
This gives a little more information. From your code, it appears that the
constructor has this line:
writeln(this.pattern);
Which succeeds. Then your test code looks like this:
auto addition = new List(number, PLUS);
// This check works fine:
writeln(addition); // --> List([0-9]+, "+", 2)
// But if I uncomment the following: segfault
// writeln(addition.pattern);
Which means between constructor (first line in test code), you printed the
item itself, then print the item's pattern field.
What it looks like to me is that between printing it in the constructor,
and printing it outside the constructor, something bad happened. There
are several pieces of code running that I don't have the source for, so I
can assume either you have a compiler bug, or it's in one of those pieces.
Try this: inside the constructor do:
writeln(this.pattern);
writeln(this);
writeln(this.pattern);
And see if that fails. If that fails, then we know it's one of those
three lines thats messing things up.
Comment out writeln(this), and see if it still fails. If it does, then
it's something being printed in your Tuple class that is causing it to
corrupt something so it can't be printed again. If not, then it's
something being printed in your List class. I don't have the code that
converts your Pattern class to a string, etc. so I can't say whether they
are an issue.
If those three lines work in the constructor, I'd say there is a possible
compiler error, because there is no difference between calling that code
from in the constructor or in the test code.
If that's the case, create a function that prints out all the addresses of
things (you can print out the address of a class by simply casting the
class reference to a void *). Print that out between each line and see
what changes, then focus there. Again, without more code, I can't say for
certain what's going on.
If you have a debugger, it might help even more than these little tricks.
-Steve
More information about the Digitalmars-d-learn
mailing list