Обсуждение: How to debugging a an external C function(IMMUTABLE STRICT )

Поиск
Список
Период
Сортировка

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

От
Dave Potts
Дата:
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 )

От
Tom Lane
Дата:
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