[postgis-users] Postgis on Solaris - gdb details

Ionut Iordache ionut at eps.berkeley.edu
Thu Feb 10 09:33:10 PST 2005


Hello strk,

Thanks for the quick response! See bellow...

Thursday, February 10, 2005, 1:28:03 AM, you wrote:

srn> On Wed, Feb 09, 2005 at 07:07:53PM -0800, Ionut Iordache wrote:
>> Hello,
>> 
>> I found a more specific reason why my installation crashes:
>> 
>> Following is an excerpt from running gdb against the backend and
>> breaking at a point close to where it crashes after executing " select
>> X(geom) from gtest;":
>> 
>> ----------------------------------------------------------------------
>> Breakpoint 2, LWGEOM_x_point (fcinfo=0xffbed600) at lwgeom_ogc.c:528
>> 528             if ( point == NULL ) PG_RETURN_NULL();
>> (gdb) print point
>> $1 = (LWPOINT *) 0x37f188
>> (gdb) print point->point
>> $2 = (POINTARRAY *) 0x37f248
>> (gdb) print point->point->dims
>> $3 = 0 '\0'
>> (gdb) print point->point->npoints
>> $4 = 1
>> (gdb) n
>> 531             p = (POINT2D *)getPoint(point->point, 0);
>> (gdb) print p
>> Cannot access memory at address 0xfffffff0
>> (gdb) n
>> 533             PG_RETURN_FLOAT8(p->x);
>> (gdb) n
>> 
>> Program received signal SIGSEGV, Segmentation fault.
>> LWGEOM_x_point (fcinfo=0xffbed600) at lwgeom_ogc.c:533
>> 533             PG_RETURN_FLOAT8(p->x);
>> (gdb) 
>> ------------------------------------------------------------------
>> 
>> My understanding is that the POINTARRAY structure passed to the "getPoint"
>> function is somehow invalid... One obvious thing that I noticed (and I
>> might be way off track here, it's my first time reading through this
>> code...) is that the dimension is always 0, where this is noted in
>> the source files:
>> 
>> /size of point represeneted in the POINTARRAY
>> // 16 for 2d, 24 for 3d, 32 for 4d
>> int
>> pointArray_ptsize(const POINTARRAY *pa)
>> {
>>         return sizeof(double)*TYPE_NDIMS(pa->dims);
>> }
>> 
>> I also tested with LINESTRING and pointArray_ptsize will always return
>> 0 here...
>> 

srn> POINTARRAY.dims is used as a bitfield for hasZ and hasM flags. 0==2d.
srn> Can you print value of pa->serialized_pointlist ?
srn> Return from getPoint should be an offset from there
srn> (+16*pointN for a 2d ptarray, same address X)
srn> --strk;

Hmm.. how about the value pointArray_ptsize(pa) is supposed to return?
That's always 0 in my case... Then,  char* getPoint(const
POINTARRAY*,int), does this:
// this does x,y
return &(pa->serialized_pointlist[size*n]);
, where the function is supposed to get the nth point of a POINTARRAY,
but it doesn't get the chance to move beyond index 0, because of
'size'...

To prove this, look at the following output:


-------------------------------------------------------------------
Breakpoint 2 at 0xfeee449c: file lwgeom_api.c, line 610.
(gdb) cont
Continuing.

Breakpoint 2, getPoint (pa=0x37f248, n=0) at lwgeom_api.c:610
610             size = pointArray_ptsize(pa);
(gdb) print size
$1 = 0
(gdb) n
612             return &(pa->serialized_pointlist[size*n]);
(gdb) print pa
$2 = (const POINTARRAY *) 0x37f248
(gdb) print pa->serialized_pointlist
$3 = (uchar *) 0xfdcc5e19 "@"
(gdb) n
0xfeee44d4      602                     return NULL;
(gdb) n
lwgeom_pointarray_length2d (pts=0x37f248) at measures.c:485
485                     POINT2D *to = (POINT2D *)getPoint(pts, i+1);
(gdb) print to->x
$4 = 2
(gdb) print to->y
$5 = 3
(gdb) cont
Continuing.

Breakpoint 2, getPoint (pa=0x37f248, n=1) at lwgeom_api.c:610
610             size = pointArray_ptsize(pa);
(gdb) print size
$6 = 0
(gdb) n
612             return &(pa->serialized_pointlist[size*n]);
(gdb) print pa
$7 = (const POINTARRAY *) 0x37f248
(gdb) print pa->serialized_pointlist
$8 = (uchar *) 0xfdcc5e19 "@"
(gdb) n
0xfeee44d4      602                     return NULL;
(gdb) n
lwgeom_pointarray_length2d (pts=0x37f248) at measures.c:486
486                     dist += sqrt( ( (frm->x - to->x)*(frm->x - to->x) )  +
(gdb) print frm->x
$9 = 2
(gdb) print frm->y
$10 = 3
----------------------------------------------------------------------------

I captured that after I run:
select length2D(geom) from gtest;
on this table:
test=# select astext(geom) from gtest ;
           astext            
-----------------------------
 LINESTRING(2 3,4 5,6 5,7 8)
(1 row)

In the case above, it crashes because "to" and "frm" point to the
exact same address...

Any ideas ??

Thanks!

PS: I did tried with the latest CVS version, actually, the output
above is generated with the cvs version.

>> 
>> Any help is greatly appreciated!
>> 
>> 
>> Tuesday, February 8, 2005, 2:40:23 PM, you wrote:
>> 
>> II> Hello,
>> 
>> II> I've been having problems for a while with Postgis on Solaris 8
>> II> (sparc). I have tried various combinations of Postgresql 8.0.1, 7.4.6
>> II> with Postgis versions 0.9.1 and up.
>> II> The problem is that after the packages compile relatively without
>> II> hassle, I can't use any postgis spatial function without crashing the
>> II> database.
>> II> For example, I create an empty database, add the lwpostgis.sql
>> II> extension, create a spatial table with point geometry, insert one row
>> II> into the table... up to this point everything is fine... when I run
>> II> "select astext(geom) ..." the point shows up correctly, but when I
>> II> execute "select X(geom) ..." the backend crashes:
>> 
>> 
>> II> server closed the connection unexpectedly
>> II>          This probably means the server terminated abnormally
>> II>          before or while processing the request.
>> II> The connection to the server was lost. Attempting reset: Failed
>> 
>> 
>> II> I compiled with LDFLAGS="-lstdc++ -lgcc" and gcc  3.4.1.
>> II> My gcc installation is configured as follows:
>> II> Reading specs from
>> II>
>> /a/perry/data/pkgs3/local/bin/../lib/gcc/sparc-sun-solaris2.8/3.4.1/specs
>> II> Configured with: ../configure --with-as=/usr/ccs/bin/as
>> II> --with-ld=/usr/ccs/bin/ld --disable-nls
>> II> Thread model: posix
>> II> gcc version 3.4.1
>> 
>> II> The compiler uses Sun's linker and I was wondering if this is part of
>> II> the problem... When I try to compile with GNU's ld, I get a
>> II> "option -dn and -P are incompatible" linker error.
>> 
>> II> The logs are not showing anything interesting, even with the highest
>> II> debug option set...
>> II> I also tried to debug the backend, but I get this error in gdb:
>> II>   Reading symbols from /usr/local/lib/libstdc++.so.6...Error
>> II> while reading shared library symbols:
>> II>   Dwarf Error: Cannot handle DW_FORM_strp in DWARF reader.
>> 
>> 
>> 
>> II> So, is anyone else using lwgeom Postgis on Solaris 8? Did you compile
>> II> gcc from scratch, or used the binaries from sunfreeware.com ?
>> II> Any ideas of what might go wrong with my installation?
>> 
>> 
>> II> Many thanks,
>> II> -----------------------------------------------
>> II> Dorel Ionut Iordache - <ionut at eps.berkeley.edu>
>> II> UC Berkeley - Earth & Planetary Science Dept.
>> 
>> II> _______________________________________________
>> II> postgis-users mailing list
>> II> postgis-users at postgis.refractions.net
>> II> http://postgis.refractions.net/mailman/listinfo/postgis-users
>> 
>> 
>> 
>> -- 
>> Best regards,
>> -----------------------------------------------
>> Dorel Ionut Iordache - <ionut at eps.berkeley.edu>
>> UC Berkeley - Earth & Planetary Science Dept.
>> 
>> _______________________________________________
>> postgis-users mailing list
>> postgis-users at postgis.refractions.net
>> http://postgis.refractions.net/mailman/listinfo/postgis-users



-- 
Best regards,
-----------------------------------------------
Dorel Ionut Iordache - <ionut at eps.berkeley.edu>
UC Berkeley - Earth & Planetary Science Dept.




More information about the postgis-users mailing list