Re: Fonction C: Segmentation fault

From: Dimitri Fontaine <dfontaine(at)hi-media(dot)com>
To: Samuel ROZE <samuel(dot)roze(at)gmail(dot)com>
Cc: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: Fonction C: Segmentation fault
Date: 2009-10-14 18:53:16
Message-ID: m2hbu1ajtv.fsf@hi-media.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale

Bonsoir,

Rapidemment aussi, avec un peu de chance plus tard dans la semaine je
pourrai regarder le code, mais je n'ai encore jamais retourné de tuple
en C...

Samuel ROZE <samuel(dot)roze(at)gmail(dot)com> writes:
> Pour le compilation, voilà ce que j'ai fait:

Regarde plutôt du côté de PGXS, tu fais un Makefile de 5 lignes et hop
ça roule. Il faut absolument utiliser les mêmes options de compilation
que ton serveur PG.

Voilà un exemple :

http://cvs.pgfoundry.org/cgi-bin/cvsweb.cgi/hstore-new/hstore-new/Makefile?rev=1.3&content-type=text/x-cvsweb-markup

> Ça marche bien. Quelques petites erreurs:
> ------------------------------------------------------------------------
> parse_url.c: In function ‘parse_url’:
> parse_url.c:25: warning: unused variable ‘length’
> parse_url.c: In function ‘parse_url_alloc’:
> parse_url.c:73: warning: control reaches end of non-void function
> parse_url.c: In function ‘parse_url’:
> parse_url.c:51: warning: ‘tupdesc’ may be used uninitialized in this
> function
> ------------------------------------------------------------------------

N'accepte aucun warning. Pas la peine de tenter d'aller plus loin en
faisant comme si tu n'avais pas vu.

> Pour la création de la fonction dans PostgreSQL:
> ------------------------------------------------------------------------
> CREATE FUNCTION parse_url (text) RETURNS record AS '/root/PgSQL-parse_url/parse_url.so', 'parse_url' LANGUAGE C;
> ------------------------------------------------------------------------

Relis la doc sur les modules externes et PGXS, et utilise :

http://www.postgresql.org/docs/8.3/interactive/xfunc-c.html

Pour reprendre l'exemple de hstore-new :

CREATE OR REPLACE FUNCTION exist(hstore,text)
RETURNS bool
AS 'MODULE_PATHNAME','hstore_exists'
LANGUAGE C STRICT IMMUTABLE;

> Pour l'éxécution:
> ------------------------------------------------------------------------
> SELECT * FROM parse_url('http://www.google.fr') as ("schema" text, "query" text);
> ------------------------------------------------------------------------
>
> L'erreur suivante m'est retournée:
> ------------------------------------------------------------------------
> server closed the connection unexpectedly
> This probably means the server terminated abnormally
> before or while processing the request.
> ------------------------------------------------------------------------

Utilise un serveur compilé avec les options --enable-debug et
--enable-cassert pour valider du code maison en C, et regarde comment
attacher gdb au backend qui traite tes requêtes. En gros, dans deux
consoles interactives a et b :

a# psql ...
b# ps aux | grep '[p]ostgres.*idle'
b# gdb -p <pid>
b# continue
a# select ...
crash
b# bt

bt ça veut dire backtrace et tu peux demander plein d'autres infos pour
savoir exactement ce qui c'est passé, regarder la valeur des variables,
tout.

Et relis bien attentivement le manuel :)

http://www.postgresql.org/docs/8.3/interactive/xfunc-c.html

--
dim

In response to

Responses

Browse pgsql-fr-generale by date

  From Date Subject
Next Message Guillaume Lelarge 2009-10-14 19:07:04 Re: Fonction C: Segmentation fault
Previous Message Samuel ROZE 2009-10-14 17:46:55 Re: Fonction C: Segmentation fault