Thread: How to debugging a an external C function(IMMUTABLE STRICT )

How to debugging a an external C function(IMMUTABLE STRICT )

From
Dave Potts
Date:
Hi

I have written an external C function to be called by postgres called
using the LANGUAGE 'C' IMMUNTABLE STRICT interface

Most of the time when call it, I get the expected results.  Some times I
get random rubbish in the result set.
Postgres always gets the type of the arguments correct, ie it knowns the
column x is a integer, column y is a float8

I called elog(NOTICE from within my code, the results always look
correct,  so I am assuming that I am sometimes returning a random
pointer, or have got the arguments to BlessTupleDesc,
MemoryContextSwitchTo wrong!

If there any debug support in Postgres to catch this type of thing?
Are there any useful functions have can be compiled in when building
postgres???

I do not have access to things like Purify

Dave

Re: How to debugging a an external C function(IMMUTABLE STRICT )

From
Tom Lane
Date:
Dave Potts <dave.potts@pinan.co.uk> writes:
> I have written an external C function to be called by postgres called
> using the LANGUAGE 'C' IMMUNTABLE STRICT interface
> Most of the time when call it, I get the expected results.  Some times I
> get random rubbish in the result set.
> If there any debug support in Postgres to catch this type of thing?

You should pretty much always do development of any C code in a backend
built with --enable-cassert --enable-debug.  In particular that will
turn on clobbering of freed memory, which is really helpful in turning
some types of sometimes-failure into consistent failures that can be
debugged.  That might not be your problem here, but it's worth a try.

I also get the impression that the only debug technique you know about
is inserting printfs.  Learn to use gdb or another debugger to step
through your code --- the learning curve isn't that steep, and the
benefits numerous.  There's useful Postgres-specific info about using
gdb here:
http://wiki.postgresql.org/wiki/Getting_a_stack_trace_of_a_running_PostgreSQL_backend_on_Linux/BSD

            regards, tom lane