Re: Debugging C functions... - Mailing list pgsql-sql
From | Dima Tkach |
---|---|
Subject | Re: Debugging C functions... |
Date | |
Msg-id | 3C92D79C.9020306@openratings.com Whole thread Raw |
In response to | Debugging C functions... (Dmitry Tkach <dmitry@openratings.com>) |
List | pgsql-sql |
Ok, never mind - I got it :-) I should be 8*sizeof(long) in the array declaration... Ahh.. sorry for such a stupid question... Dima Dmitry Tkach wrote: > Hi, everybody! > > Here is me again, with my bitwise indexing troubles :-) > (Refer to btree index extension topic from yesterday)... > > I have, pretty much, given up the idea to make btrees (or rtrees) do > what I need... now I am trying to make it work with a GiST index (as Tom > Lane suggested earlier)... Because I am too stupid and too lazy to > figure out how to implement GiST from scratch, I am trying to use the > intarray code from contrib - it seems to do exactly what I need, except > it deals with _int4 arrays instead of bitsets. > > So, I wrote a C function called pack (should be unpack really, but never > mind :-), that converts my bits into an array, and try to index my table: > > create index bset_idx on bset using gist (pack (flags)); > > this runs for a few minutes, and then the backend crashes. All I can see > in the log is: > > ---- > Server process (pid 29372) exited with status 11 at Fri Mar 15 18:33:50 2002 > Terminating any active server processes... > Server processes were terminated at Fri Mar 15 18:33:50 2002 > Reinitializing shared memory and semaphores > The Data Base System is starting up > ---- > > I assume, there must be some bug in the func. I wrote, that's causing > the crash... The question is - how do I debug it? > Are there some techniques to do that (like attaching to the running > backend with a debugger, or something else, perhaps, somehow turning > more debug output on)? > > Below is the entire C code I wrote (I am attaching it, hoping, that, > perhaps, somebody would be able to just spot the problem by looking at > it)... It creates one function, that takes an int4 (the bits) and a > second arg, being the maximum bit, that can be set (this is to be able > to work with both int2 and int4)... > And then I have sql wrappers: > > create function pack(int4) returns _int4 as 'select pack($1, 1<<31);' > language 'sql'; > create function pack(int2) returns _int4 as 'select pack($1::int4, > 1<<15);' language 'sql'; > > Here is the C source: > > > #include "postgres.h" > #include "utils/array.h" > > ArrayType *pack(int,long); > ArrayType *wrap_array(void *, int, int); > > ArrayType *pack (int bits, long max) > { > static int4 buff [sizeof (long)]; > long b; > int count; > > for (b = 1, count = 0; b <= max; b <<= 1) > if (bits & b) > buff [count++] = b; > return wrap_array (buff, count, sizeof(int4)); > } > > ArrayType *wrap_array (void *ptr, int alen, int elen) > { > int numbytes = alen*elen; > int sz = numbytes + ARR_OVERHEAD (1); > ArrayType *result = (ArrayType *) palloc (sz); > result -> size = sz; > result -> ndim = 1; > result -> flags = 0; > ARR_DIMS(result)[0] = alen; > ARR_LBOUND(result)[0] = 1; > memmove (ARR_DATA_PTR(result), ptr, numbytes); > return result; > } > > I compile it with: > gcc -Wall -Wmissing-prototypes -Wmissing-declarations -fpic -I. > -I../../src/include -DPGSQL71 -c _bits.c -o _bits.o > > I will greatly appreciate your responses... > > Thanks a lot! > > Dima > > > > > ---------------------------(end of broadcast)--------------------------- > TIP 4: Don't 'kill -9' the postmaster >