[fpc-pascal] How to analyze a core dump?

Luca Olivetti luca at ventoso.org
Wed Jun 27 12:48:00 CEST 2007


En/na Vinzent Hoefler ha escrit:
> On Tuesday 26 June 2007 17:26, Luca Olivetti wrote:
> 
>> procedure TButlerPhone.Receive(s: string);
>>
>> so s is a parameter.
>> This procedure is called exclusively from
>>
>> procedure TStatusThread.Receive;
>> begin
>>    FOwner.Receive(FData)
>> end;
>>
>> (FOwner is a TButlerPhone)
>>
>> which in turn is called only here:
>>
>>            FData:=copy(buffer,i+2,L-1);
>>            if buffer[i+L+1]=checksum(FData) then
>>            begin
>>             if not terminated then synchronize(@Receive);
>>            end else
> 
> Are you passing AnsiString types between threads?

yes and no: the synchronize should assure that TButlerPhone.Receive is 
called from the main thread, and TStatusThread will wait until 
completion of the call.

> If that's the case try 
> using shortstrings or make a local copy of the parameter

I'll try that (though I think it shouldn't be necessary)

>. And *DO NOT* 
> pass them to a C-library in any way!

Not even surrounded by PChar()?
(now that I think of it, it could well be that the library is storing 
the pointer and using it later when it is no longer valid, let me 
check....no, it doesn't).

> I had several problems doing that too (and I don't mean the obvious case 
> if the string is changed in one thread while it's still accessed in the 
> other). There also seemed to be some issues with the reference 
> counting: if I passed a local AnsiString to a thread constructor as 
> argument and left the routine then, this seemed to confuse the thread 
> throwing SIGSEGVs occasionally. Making a copy of the string (means: 
> assigning it to a field in the thread instance before and using this 
> field from now on) inside the constructor solved this problem.

Do you mean like (absurd example, I know)

TMyThread.Constructor(astring:string);
begin
   FString:=astring;
   FNum:=StrToInt(FString);
   inherited create(false);
end;


instead of

TMyThread.Constructor(astring:string);
begin
   FNum:=StrToInt(astring);
   inherited create(false);
end;


again, I don't think it should be necessary if you're only going to use 
astring in the constructor.

> 
> BTW, using the "disassemble" function of gdb sometimes reveals where the 
> unnamed routine really is, so for the
> 
>> #3  0x08059bec in ?? ()
>> No symbol table info available.
> 
> "disassemble 0x8059bec" *might* help you invastigating the source of the 
> problem further.

thanks, I'll give it a try, though the last time I used assembly 
language was with a Z80 when it was new ;-)

Bye
-- 
Luca



More information about the fpc-pascal mailing list