[Lazarus] SIGSEGV on lclrescache.pas

classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

[Lazarus] SIGSEGV on lclrescache.pas

Dave Coventry
I have a unit in which I'm parsing a large text file.

I have around 50 (or more!) IF statements as below:

if Pos('  Center Point',OdReadstrings.Strings[i])>0 then
                val+=',PT='+getParam(PChar(OdReadstrings.Strings[i]))
else if Pos('  Custom Scale',OdReadstrings.Strings[i])>0 then
                val+=',SC='+getParam(PChar(OdReadstrings.Strings[i]))
else if Pos('  Check',OdReadstrings.Strings[i])=1 then
                val+=',FZ='+getParam(PChar(OdReadstrings.Strings[i]))
else if Pos('  Min Extents',OdReadstrings.Strings[i])>0 then
                val+=',MN='+getParam(PChar(OdReadstrings.Strings[i]))
else if Pos('  Max Extents',OdReadstrings.Strings[i])>0 then  etc, etc.

No error is generated from this code, per se, but on closing the programme there is an External SIGSEVV genterated in lclrescache.pas at line 186.

The offending line:

Cache.RemoveItem(Self);

Can anyone see what's going on here? Alternatively, is there a better way of parsing a large text file for phrases?

Many thanks,

Dave Coventry

--
_______________________________________________
Lazarus mailing list
[hidden email]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
Reply | Threaded
Open this post in threaded view
|

Re: [Lazarus] SIGSEGV on lclrescache.pas

Mattias Gaertner
On Mon, 17 Jun 2013 12:17:58 +0200
Dave Coventry <[hidden email]> wrote:

> I have a unit in which I'm parsing a large text file.
>
> I have around 50 (or more!) IF statements as below:
>
> if Pos('  Center Point',OdReadstrings.Strings[i])>0 then
>                 val+=',PT='+getParam(PChar(OdReadstrings.Strings[i]))
> else if Pos('  Custom Scale',OdReadstrings.Strings[i])>0 then
>                 val+=',SC='+getParam(PChar(OdReadstrings.Strings[i]))
> else if Pos('  Check',OdReadstrings.Strings[i])=1 then
>                 val+=',FZ='+getParam(PChar(OdReadstrings.Strings[i]))
> else if Pos('  Min Extents',OdReadstrings.Strings[i])>0 then
>                 val+=',MN='+getParam(PChar(OdReadstrings.Strings[i]))
> else if Pos('  Max Extents',OdReadstrings.Strings[i])>0 then  etc, etc.
>
> No error is generated from this code, per se, but on closing the programme
> there is an External SIGSEVV genterated in lclrescache.pas at line 186.
>
> The offending line:
>
> Cache.RemoveItem(Self);

I see no relationship to your code. Probably it is a side effect of a
destroyed heap.
Why do you think that the the above Ifs causes lclrescache to
crash?

 
> Can anyone see what's going on here? Alternatively, is there a better way
> of parsing a large text file for phrases?

Fetch the string only once:
s:=OdReadstrings.Strings[i]
if Pos('  Center Point',s)>0 then
...

Even faster:
Parse the line for tokens and use hash maps.

Mattias

--
_______________________________________________
Lazarus mailing list
[hidden email]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
Reply | Threaded
Open this post in threaded view
|

Re: [Lazarus] SIGSEGV on lclrescache.pas

Dave Coventry
In reply to this post by Dave Coventry
Appologies!

Sent to the wrong list, dammit :blush:


On 17 June 2013 12:17, Dave Coventry <[hidden email]> wrote:
I have a unit in which I'm parsing a large text file.

I have around 50 (or more!) IF statements as below:

if Pos('  Center Point',OdReadstrings.Strings[i])>0 then
                val+=',PT='+getParam(PChar(OdReadstrings.Strings[i]))
else if Pos('  Custom Scale',OdReadstrings.Strings[i])>0 then
                val+=',SC='+getParam(PChar(OdReadstrings.Strings[i]))
else if Pos('  Check',OdReadstrings.Strings[i])=1 then
                val+=',FZ='+getParam(PChar(OdReadstrings.Strings[i]))
else if Pos('  Min Extents',OdReadstrings.Strings[i])>0 then
                val+=',MN='+getParam(PChar(OdReadstrings.Strings[i]))
else if Pos('  Max Extents',OdReadstrings.Strings[i])>0 then  etc, etc.

No error is generated from this code, per se, but on closing the programme there is an External SIGSEVV genterated in lclrescache.pas at line 186.

The offending line:

Cache.RemoveItem(Self);

Can anyone see what's going on here? Alternatively, is there a better way of parsing a large text file for phrases?

Many thanks,

Dave Coventry


--
_______________________________________________
Lazarus mailing list
[hidden email]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
Reply | Threaded
Open this post in threaded view
|

Re: [Lazarus] SIGSEGV on lclrescache.pas

Dave Coventry
Ooops. No, it was the right list.

The Postgres User's list is also called "General", so I thought I'd confused the two.

More embarrassment....


On 17 June 2013 12:35, Dave Coventry <[hidden email]> wrote:
Appologies!

Sent to the wrong list, dammit :blush:


On 17 June 2013 12:17, Dave Coventry <[hidden email]> wrote:
I have a unit in which I'm parsing a large text file.

I have around 50 (or more!) IF statements as below:

if Pos('  Center Point',OdReadstrings.Strings[i])>0 then
                val+=',PT='+getParam(PChar(OdReadstrings.Strings[i]))
else if Pos('  Custom Scale',OdReadstrings.Strings[i])>0 then
                val+=',SC='+getParam(PChar(OdReadstrings.Strings[i]))
else if Pos('  Check',OdReadstrings.Strings[i])=1 then
                val+=',FZ='+getParam(PChar(OdReadstrings.Strings[i]))
else if Pos('  Min Extents',OdReadstrings.Strings[i])>0 then
                val+=',MN='+getParam(PChar(OdReadstrings.Strings[i]))
else if Pos('  Max Extents',OdReadstrings.Strings[i])>0 then  etc, etc.

No error is generated from this code, per se, but on closing the programme there is an External SIGSEVV genterated in lclrescache.pas at line 186.

The offending line:

Cache.RemoveItem(Self);

Can anyone see what's going on here? Alternatively, is there a better way of parsing a large text file for phrases?

Many thanks,

Dave Coventry



--
_______________________________________________
Lazarus mailing list
[hidden email]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
Reply | Threaded
Open this post in threaded view
|

Re: [Lazarus] SIGSEGV on lclrescache.pas

Dave Coventry
In reply to this post by Mattias Gaertner
Thanks for the reply, Mattias.


On 17 June 2013 12:35, Mattias Gaertner <[hidden email]> wrote:
I see no relationship to your code. Probably it is a side effect of a
destroyed heap.
Why do you think that the the above Ifs causes lclrescache to
crash?
 
I can't either, but if I remove the code from the unit, the crash no longer occurs.

Fetch the string only once:
s:=OdReadstrings.Strings[i]
if Pos('  Center Point',s)>0 then
...

Even faster:
Parse the line for tokens and use hash maps.
 
I'll look into that. Thanks.

--
_______________________________________________
Lazarus mailing list
[hidden email]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus


--
_______________________________________________
Lazarus mailing list
[hidden email]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus