PostgreSQL
La base de données la plus sophistiquée au monde.

Ouverture de session

Navigation

Contactez-nous

Administration du site :
"equipe chez postgresqlfr point org"

Contact presse :
"fr chez postgresql point org"

Contact association :
"bureau chez postgresqlfr point org"

Questions PostgreSQL :
 IRC :
  serveur irc.freenode.net
  canal #postgresqlfr

Recherche

Accéder aux archives

« Octobre 2008  
Lun Mar Mer Jeu Ven Sam Dim
  2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31  

Syndication

Flux XML

Sondage

Quelle est la version de PostgreSQL la plus répandue sur vos serveurs ?
8.3
10%
8.2
42%
8.1
40%
8.0
2%
7.4
6%
7.3 ou antérieure
0%
Nombre de votes: 48

PqExec et Segmentation Fault

Technique - interfaces | PqExec et Segmentation Fault

Par SangJun le 31/05/2007 - 15:02

Bonjour,

Comment se fait que PgExec génère une erreur de segmentation pour une requête qui s'exécute "manuellement" si on la copie-colle sur PgAdmin?

J'ai beau retourner le problème dans tout les sens, je ne vois pas comment m'en sortir. Je copie-colle le code pour donner un peu plus de détails.

Merci de votre aide

#include
#include
#include "libpq-fe.h"

static void exit_nicely(PGconn *conn)
{
PQfinish(conn);
exit(1);
}

int bande()
{
const char *conninfo;
PGconn *conn;
PGresult *res;
int nFields;
int i, j;

char maRequete[250];

int i = 1; int j = 2;

conninfo = "***chaine pour se connecter***";

/* Make a connection to the database */
conn = PQconnectdb(conninfo);

/* Check to see that the backend connection was successfully made */
if (PQstatus(conn) != CONNECTION_OK)
{
fprintf(stderr, "Connection to database failed: %s", PQerrorMessage(conn));
exit_nicely(conn);
}

/* Start a transaction block */
res = PQexec(conn, "BEGIN");
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "BEGIN command failed: %s", PQerrorMessage(conn));
PQclear(res);
exit_nicely(conn);
}

/*
* Should PQclear PGresult whenever it is no longer needed to avoid memory
* leaks
*/
PQclear(res);

while(j<=nbPoints)
{ strcpy(maRequete,"***une requete***");

printf("%s \n",maRequete);

res = PQexec(conn,maRequete);

if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
fprintf(stderr, "SELECT failed: %s \n", PQerrorMessage(conn));
fprintf(stderr, "maRequete= %s \n", maRequete);
PQclear(res);
exit_nicely(conn);
}

PQclear(res);

if (i==1) //Si c'est le premier segment, on crée le premier polygone
{
strcpy(maRequete,"***une requete***");

res = PQexec(conn,maRequete);

if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
fprintf(stderr, "SELECT failed: %s \n", PQerrorMessage(conn));
fprintf(stderr, "maRequete= %s \n", maRequete);
PQclear(res);
exit_nicely(conn);
}

PQclear(res);
}else // Sinon on fait une union avec le nouveau polygone
{
strcpy(maRequete,"***une requete***");

printf("%s\n",maRequete);

res = PQexec(conn,maRequete); /* Instruction qui génère l'erreur de segmentation */

if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
fprintf(stderr, "SELECT failed: %s \n", PQerrorMessage(conn));
fprintf(stderr, "maRequete= %s \n", maRequete);
PQclear(res);
exit_nicely(conn);
}

PQclear(res);
}

i++;
j++;
}

/* end the transaction */
res = PQexec(conn, "END");
PQclear(res);

/* close the connection to the database and cleanup */
PQfinish(conn);

return 0;
}

Options d'affichage des commentaires

Sélectionnez la méthode d'affichage des commentaires que vous préférez, puis cliquez sur "Sauvegarder les paramètres" pour activer vos changements.

const char *conninfo; conni

sparky/ = 31 Mai, 2007 - 15:45

const char *conninfo;
conninfo = "***chaine pour se connecter***";

A quelle moment as-tu réservé de la mémoire pour conninfo ???
Il vaut mieux faire
char * conninfo;
strdup(conninfo,'*** chaine pour se connecter ****');


ça n'a pas pourtant pas l'ai

SangJun/ = 31 Mai, 2007 - 16:15

ça n'a pas pourtant pas l'air d'être cela qui cause problème puisque les PqExec précédants s'exécutent.


J'ai modifié avec conninfo =

SangJun/ = 31 Mai, 2007 - 16:59

J'ai modifié avec conninfo = strdup("*** chaine pour se connecter ***);

meme résultat


Bonjour Un petite trace av

Christophe Chauvet/ = 1 Juin, 2007 - 10:17

Bonjour

Un petite trace avec gdb ainsi que les paramètres de compilation. Ainsi que la version de PostgreSQL et de la LibPq

Cordialement.

Christophe Chauvet
KrysKool.org


Je t'envoie ce que je peux :

SangJun/ = 1 Juin, 2007 - 11:21

Je t'envoie ce que je peux :

(gdb) run Starting program: /dea/fsauvage/nouveau [Thread debugging USING libthread_db enabled] [New Thread -1212294464 (LWP 18936)] Program received signal SIGSEGV, Segmentation fault. [Switching TO Thread -1212294464 (LWP 18936)] 0xb7fca5c9 IN PQconsumeInput () FROM /usr/lib/libpq.so.4 (gdb) bt #0 0xb7fca5c9 in PQconsumeInput () from /usr/lib/libpq.so.4 #1 0xb7fcaf07 in PQgetResult () from /usr/lib/libpq.so.4 #2 0xb7fcb2c5 in PQputCopyEnd () from /usr/lib/libpq.so.4 #3 0xb7fcb50f in PQexec () from /usr/lib/libpq.so.4 #4 0x080495fe in bande () at bande.c:254 #5 0x08049841 in main () at bande.c:315

fsauvage@clodomir4:~$ gcc -I/usr/include/postgresql/ -lpq /usr/lib/libpq.a bande.c -o nouveau -lm

"PostgreSQL 8.1.4 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 3.2.3 20030502 (Red Hat Linux 3.2.3-52)"

Pour la version de LibPq, je ne sais pas comment la trouver.


Après ce changement : [co

SangJun/ = 1 Juin, 2007 - 11:59

Après ce changement :

[code]strcpy(maRequete,"***une requete***");

fflush(stdout);

printf("OK1\n");
if(PQstatus(conn) != CONNECTION_OK)
{
printf("PQstatus(conn) != CONNECTION_OK\n");
}
printf("OK2\n",maRequete);

res = PQexec(conn,maRequete); /* Instruction qui génère l'erreur de segmentation */
[/code]

Le terminal m'affiche :

[code]fsauvage@clodomir4:~$ gcc -I/usr/include/postgresql/ -lpq /usr/lib/libpq.a bande.c -o nouveau -lm
bande.c: Dans la fonction «bande» :
bande.c:19: attention : incompatible implicit declaration of built-in function «strcpy»
bande.c:38: attention : incompatible implicit declaration of built-in function «strdup»
bande.c:66: attention : incompatible implicit declaration of built-in function «strcat»
bande.c:151: attention : incompatible implicit declaration of built-in function «atan»
bande.c:154: attention : incompatible implicit declaration of built-in function «cos»
bande.c:155: attention : incompatible implicit declaration of built-in function «sin»
fsauvage@clodomir4:~$ nouveau
OK1
Erreur de segmentation
fsauvage@clodomir4:~$ gcc -g -I/usr/include/postgresql/ -lpq /usr/lib/libpq.a bande.c -o nouveau -lm
bande.c: Dans la fonction «bande» :
bande.c:19: attention : incompatible implicit declaration of built-in function «strcpy»
bande.c:38: attention : incompatible implicit declaration of built-in function «strdup»
bande.c:66: attention : incompatible implicit declaration of built-in function «strcat»
bande.c:151: attention : incompatible implicit declaration of built-in function «atan»
bande.c:154: attention : incompatible implicit declaration of built-in function «cos»
bande.c:155: attention : incompatible implicit declaration of built-in function «sin»
fsauvage@clodomir4:~$ gdb nouveau
GNU gdb 6.4-debian
Copyright 2005 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".

(gdb) run
Starting program: /dea/fsauvage/nouveau
[Thread debugging using libthread_db enabled]
[New Thread -1212847424 (LWP 10523)]
OK1

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread -1212847424 (LWP 10523)]
0xb7f41e79 in PQstatus () from /usr/lib/libpq.so.4
(gdb) bt
#0 0xb7f41e79 in PQstatus () from /usr/lib/libpq.so.4
#1 0x08049705 in bande () at bande.c:258
#2 0x0804998f in main () at bande.c:325
[/code]


J'ai fait des tests en change

SangJun/ = 1 Juin, 2007 - 16:00

J'ai fait des tests en changeant de taille ma variable maRequete (et d'une autre chaine que je concatène à maRequete) et l'erreur intervient plus tard.

La POO c'est tellement mieux :(


© PostgreSQLFr, tous droits réservés.
Site déclaré à la CNIL sous le numéro 1074678, conformément à la Loi en vigueur.