<div dir="ltr">Paul and strk, thanks for the suggestions. strk: My source tree is behind HEAD and lwgeom_set_handlers does not appear in it; I'll look out for that in the future.<div><br></div><div style>I built the latest stable versions of PostgreSQL (9.2.2) and PostGIS (2.0.2), both built with --enable-debug, on a different machine (RHEL 6) and following Paul's instructions, got the following backtrace showing the segfault occurring in pfree:</div>
<div style><br></div><div style><br></div><div style><div>$ PGDATA=/mnt/drive2/postgres/main gdb postgres</div><div>GNU gdb (GDB) Red Hat Enterprise Linux (7.2-56.el6)</div><div>Copyright (C) 2010 Free Software Foundation, Inc.</div>
<div>License GPLv3+: GNU GPL version 3 or later <<a href="http://gnu.org/licenses/gpl.html">http://gnu.org/licenses/gpl.html</a>></div><div>This is free software: you are free to change and redistribute it.</div><div>
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"</div><div>and "show warranty" for details.</div><div>This GDB was configured as "x86_64-redhat-linux-gnu".</div><div>
For bug reporting instructions, please see:</div><div><<a href="http://www.gnu.org/software/gdb/bugs/">http://www.gnu.org/software/gdb/bugs/</a>>...</div><div>Reading symbols from /usr/local/pgsql/bin/postgres...done.</div>
<div>(gdb) run --single dfuhry</div><div>Starting program: /usr/local/pgsql/bin/postgres --single dfuhry</div><div><br></div><div>PostgreSQL stand-alone backend 9.2.2</div><div>backend> select test2();</div><div>[g_serialized.c:gserialized_from_any_size:378] Input type: Point</div>
<div>[g_serialized.c:gserialized_from_lwpoint_size:286] point size = 24</div><div>[g_serialized.c:gserialized_from_lwgeom_size:420] g_serialize size = 32</div><div>[g_serialized.c:gserialized_from_lwgeom_any:677] Input type (1) Point, hasz: 0 hasm: 0</div>
<div>[g_serialized.c:gserialized_from_lwgeom_any:678] LWGEOM(0xc5a200) uint8_t(0xc5a238)</div><div>[g_serialized.c:gserialized_from_lwpoint:445] lwpoint_to_gserialized(0xc5a200, 0xc5a238) called</div><div>[g_serialized.c:gserialized_set_srid:78] Called with srid = 4326</div>
<div><span class="" style="white-space:pre">    </span> 1: test2<span class="" style="white-space:pre"> </span>(typeid = 16391, len = -1, typmod = -1, byval = f)</div><div><span class="" style="white-space:pre"> </span>----</div>
<div>[g_serialized.c:gserialized_get_type:50] entered</div><div>[g_serialized.c:lwgeom_from_gserialized:1137] Got type 1 (Point), srid=4326</div><div>[g_serialized.c:lwgeom_from_gserialized_buffer:1091] Got type 1 (Point), hasz=0 hasm=0 geodetic=0 hasbox=0</div>
<div>[g_serialized.c:gserialized_get_type:50] entered</div><div>[lwgeom.c:lwgeom_set_srid:1360] entered with srid=4326</div><div>[lwgeom.c:lwgeom_is_empty:1138] lwgeom_is_empty: got type Point</div><div>[lwout_wkb.c:lwgeom_to_wkb:702] WKB output size: 25</div>
<div>[lwout_wkb.c:lwgeom_to_wkb:715] Hex WKB output size: 51</div><div>[lwgeom.c:lwgeom_is_empty:1138] lwgeom_is_empty: got type Point</div><div>[lwout_wkb.c:lwpoint_to_wkb_buf:385] Entering function, buf = 0xc63e40</div>
<div>[lwout_wkb.c:lwpoint_to_wkb_buf:387] Endian set, buf = 0xc63e42</div><div>[lwout_wkb.c:integer_to_wkb_buf:189] Writing value '536870913'</div><div>[lwout_wkb.c:lwpoint_to_wkb_buf:390] Type set, buf = 0xc63e4a</div>
<div>[lwout_wkb.c:integer_to_wkb_buf:189] Writing value '4326'</div><div>[lwout_wkb.c:lwpoint_to_wkb_buf:395] SRID set, buf = 0xc63e52</div><div>[lwout_wkb.c:ptarray_to_wkb_buf:353] Writing point #0</div><div>[lwout_wkb.c:ptarray_to_wkb_buf:357] Writing dimension #0 (buf = 0xc63e52)</div>
<div>[lwout_wkb.c:ptarray_to_wkb_buf:357] Writing dimension #1 (buf = 0xc63e62)</div><div>[lwout_wkb.c:ptarray_to_wkb_buf:361] Done (buf = 0xc63e72)</div><div>[lwout_wkb.c:lwpoint_to_wkb_buf:399] Pointarray set, buf = 0xc63e72</div>
<div>[lwout_wkb.c:lwgeom_to_wkb:751] buf (0xc63e73) - wkb_out (0xc63e40) = 51</div><div><span class="" style="white-space:pre">     </span> 1: test2 = "0101000020E610000000000000000000000000000000000000"<span class="" style="white-space:pre">        </span>(typeid = 16391, len = -1, typmod = -1, byval = f)</div>
<div><br></div><div>Program received signal SIGSEGV, Segmentation fault.</div><div>0x000000000072488b in pfree (pointer=0xc63e40) at mcxt.c:659</div><div>659<span class="" style="white-space:pre">          </span>(*header->context->methods->free_p) (header->context, pointer);</div>
<div>Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.47.el6_2.9.x86_64 libxml2-2.7.6-4.el6_2.4.x86_64 proj-4.7.0-2.el6.x86_64 zlib-1.2.3-27.el6.x86_64</div><div>(gdb) bt</div><div>#0  0x000000000072488b in pfree (pointer=0xc63e40) at mcxt.c:659</div>
<div>#1  0x0000000000458fc1 in debugtup (slot=0xc60c00, self=Unhandled dwarf expression opcode 0xf3</div><div>) at printtup.c:549</div><div>#2  0x0000000000576ea2 in ExecutePlan (queryDesc=0xc604f0, direction=Unhandled dwarf expression opcode 0xf3</div>
<div>) at execMain.c:1418</div><div>#3  standard_ExecutorRun (queryDesc=0xc604f0, direction=Unhandled dwarf expression opcode 0xf3</div><div>) at execMain.c:301</div><div>#4  0x0000000000649570 in PortalRunSelect (portal=0xc5e4e0, forward=Unhandled dwarf expression opcode 0xf3</div>
<div>) at pquery.c:944</div><div>#5  0x000000000064a880 in PortalRun (portal=0xc5e4e0, count=9223372036854775807, isTopLevel=1 '\001', dest=0xb0ffa0, altdest=0xb0ffa0, completionTag=0x7fffffffe2d0 "") at pquery.c:788</div>
<div>#6  0x0000000000646b07 in exec_simple_query (argc=Unhandled dwarf expression opcode 0xf3</div><div>) at postgres.c:1046</div><div>#7  PostgresMain (argc=Unhandled dwarf expression opcode 0xf3</div><div>) at postgres.c:3958</div>
<div>#8  0x00000000005a7adb in main (argc=3, argv=0xb78b10) at main.c:197</div><div><br></div><div><br></div><div style>I noticed that header->context->methods points (as do ->parent and ->name) to an invalid address:</div>
<div><br></div><div><div>(gdb) f 0</div><div>#0  0x000000000072488b in pfree (pointer=0xc63e40) at mcxt.c:659</div><div>659<span class="" style="white-space:pre">              </span>(*header->context->methods->free_p) (header->context, pointer);</div>
<div>(gdb) p *header->context</div><div>$8 = {type = 1237353800, methods = 0x7e01be000003c484, parent = 0x9a00e8c789480087, firstchild = 0xfa840fc08548ffd4, nextchild = 0x1c3883d0ff000002, </div><div>  name = 0x279840fc58948 <Address 0x279840fc58948 out of bounds>, isReset = 0 '\000'}</div>
<div>(gdb) p *header->context->methods</div><div>Cannot access memory at address 0x7e01be000003c484</div></div><div><br></div><div style>Suggestions?</div><div style><br></div><div style>I've attached the files with a slightly updated .c. The "Unhandled dwarf expression opcode 0xf3" messages apparently mean my gdb is old, although it is the latest in RHEL 6 repositories.</div>
<div style><br></div><div style>-Dave</div></div><div style><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Jan 10, 2013 at 11:53 AM, Sandro Santilli <span dir="ltr"><<a href="mailto:strk@keybit.net" target="_blank">strk@keybit.net</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">On Thu, Jan 10, 2013 at 10:57:08AM -0500, David Fuhry wrote:<br>
<br>
>    I'm trying to write a C-Library function to return a PostGIS point. It's<br>
> crashing the backend when called:<br>
><br>
> => select test2();<br>
> The connection to the server was lost. Attempting reset: Failed.<br>
<br>
</div>[...]<br>
<br>
> #include "liblwgeom.h"<br>
><br>
> PG_MODULE_MAGIC;<br>
><br>
> /* This is needed by liblwgeom */<br>
> void lwgeom_init_allocators(void)<br>
> {<br>
>   lwgeom_install_default_allocators();<br>
> }<br>
<br>
David, if you're using current trunk you'll need and explicit<br>
call to lwgeom_set_handlers() for registering allocators for liblwgeom.<br>
Simply defining lwgeom_init_allocators is not enough anymore.<br>
<br>
Note that failing to register the handlers will result in lwerror<br>
simply printing an error on stderr but not interrupting the control<br>
flow in your function body. I noticed there's no PG_RETURN_NULL()<br>
on error, it's a good practice to not assume lwerror throws an<br>
exception.<br>
<br>
--strk;<br>
<div class="HOEnZb"><div class="h5"><br>
_______________________________________________<br>
postgis-devel mailing list<br>
<a href="mailto:postgis-devel@lists.osgeo.org">postgis-devel@lists.osgeo.org</a><br>
<a href="http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-devel" target="_blank">http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-devel</a><br>
</div></div></blockquote></div><br></div>