Обсуждение: How to debugging a an external C function(IMMUTABLE STRICT )
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
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