| From: | Dmitry Tkach <dmitry(at)openratings(dot)com> | 
|---|---|
| To: | pgsql-sql(at)postgresql(dot)org, pgsql-general(at)postgresql(dot)org | 
| Subject: | Debugging C functions... | 
| Date: | 2002-03-16 02:04:23 | 
| Message-ID: | 3C92A827.6050409@openratings.com | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-general pgsql-sql | 
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
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Carlo Florendo | 2002-03-16 02:17:36 | Re: pg_hba.conf | 
| Previous Message | Alvaro Herrera | 2002-03-16 01:59:32 | docbook.m4 | 
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Dima Tkach | 2002-03-16 05:26:52 | Re: Debugging C functions... | 
| Previous Message | Dmitry Tkach | 2002-03-16 01:50:56 | Re: Btree index extension question |