WINDOWS/MinGW mit libpg: PQgetvalue crashed

Programmierung mit PostgreSQL (C#, PHP, Perl, Java, ...)
Antworten
df5zx
Neuer Benutzer
Beiträge: 2
Registriert: Di 26. Mär 2019, 07:50

WINDOWS/MinGW mit libpg: PQgetvalue crashed

Beitrag von df5zx » Di 26. Mär 2019, 08:37

Hallo zusammen,

nachdem ich in vielen Foren/Webseiten/Suchmaschinen nichts zu meinem Problem gefunden habe was passen könnte, versuche ich es mal hier:

Wir wollen ein open source-Produktionplanungssystem (MES) einsetzen, das Postgres-datenbanken nutzt. Um ein paar Daten aus dem System in eine SPS bzw. ein SCADA-System zu übertragen, damit eine Maschine automatisch vom MES angesteuert läuft ( ein paar wenige Felder), brauchen wir einen "Connector".
Zum Testen habe ich mir die DB-Inhalte in PGadmin angesehen und testweise von einem XAMPP-System abgerufen, um sie mir ansehen zu können.
Daten sind da, können abgerufen werden, alles "normal".
Zum Einstieg für unseren Connector habe ich unter WINDOWS (mit MinGW64 unter OrwellDev-C++ und auch wxDev-C++) die Beispiele aus der Postgres-Doku ausprobiert, wobei ein fundamentales Problem auftritt:

PQExec, PQnfields,PQntuples etc geht alles problemlos und fehlerfrei, ABER der Aufruf von PQgetvalue crashed intern. Aufgerufen wird die Funktion, kommt aber nicht mehr zurück ...

Das habe ich mit den aktuellen Download-Binaries der Versionen 9,10,11 und unter WIN7-64 und WIN10-64 getestet, es benimmt sich überall genauso. Da ich mir nicht vorstellen kann, dass ein solcher fundamentaler BUG nicht schon lange gemeldet wäre, liegt es wohl an unserer Systemumgebung oder schlimmer, an mir :-) ...


Irgendeine Idee, was ich da falsch mache oder den Bug nicht sehe bzw. nicht weiß? Der Codeschnipsel unten wird ja genau so in 100en von Programmen benutzt ...

.
.
.
/* first, print out the attribute names */
nFields = PQnfields(res);
for (i = 0; i < nFields; i++)
printf("%-15s", PQfname(res, i));
printf("\n\n");

/* next, print out the rows */
for (i = 0; i < PQntuples(res); i++)
{
for (j = 0; j < nFields; j++)
printf("%-15s", PQgetvalue(res, i, j)); <--- hier crashed das Programm in PQgetvalue
printf("\n");
}
.
.
.
Danke schon mal im Voraus,
Jürgen

pogomips
Erfahrener Benutzer
Beiträge: 105
Registriert: Fr 18. Nov 2016, 09:55

Re: WINDOWS/MinGW mit libpg: PQgetvalue crashed

Beitrag von pogomips » Di 26. Mär 2019, 19:14

Ich kann Dir mit dem Fehler nicht helfen. "Crash" ist auch nicht sehr aussagekräftig.
Könnte laut Code eine Überschreitung der Feldanzahl sein.

Aber was ist Dein Ziel? Was möchtest Du programmieren?

df5zx
Neuer Benutzer
Beiträge: 2
Registriert: Di 26. Mär 2019, 07:50

Re: WINDOWS/MinGW mit libpg: PQgetvalue crashed

Beitrag von df5zx » Mi 27. Mär 2019, 12:23

Hallo,

leider kann ich Crash nicht genauer benennen, weil die EXE aus dem Beispiel beim Aufruf von PGgetvalue sich beendet ... Alle anderen Aufrufe gingen aber, von den benötigten Feldern usw. konnte ich Typ und Länge abfragen usw ...Nur das Abrufen der Werte an sich beendet die EXE mit Errorcode 255, wie sich mit einfachen printf-Meldungen vor und nach dem PGgetvalue-Aufruf einfach zeigen ließ ...

Ich muss ein paar Felder aus der Datenbank lesen und in eine SPS übertragen und ein paar Werte zurück von SPS in die DB schreiben... Wenn es mit dem Dev-C++ nicht in den Griff zu bekommen ist, werde ich es dann mal mit Python versuchen.
Mit dem Dev-C++ hat für mich den Vorteil, dass ich für die SPS-Seite und Datenkonvertierung bzw. Übertragungen aller Art eine Menge fertige Module habe :-) ... Die muss ich dann für Python halt neu machen.
Der o.g. Fehler ist nur wirklich ungewöhnlich, da scheinbar genau nur ein API-Aufruf nicht so funktioniert wie geplant ...
Naja, der Code ist ja im Prinzip der Beispielcode, der dabei ist ...
Die betreffenden Werte hatte ich mit php in XAMPP-Webseiten auch schon fehlerfrei abrufen können, so dass ich sicher bin, dass die DB auch ok an der Stelle ok ist ...

Gruß,
Jürgen

Dravion
Benutzer
Beiträge: 36
Registriert: So 6. Nov 2016, 09:43

Re: WINDOWS/MinGW mit libpg: PQgetvalue crashed

Beitrag von Dravion » Do 28. Mär 2019, 10:03

Wenn das Programm beendet wird, dann ist es eine Speicherzugriffsverletzung/AccessViolation oder unter Linux ein Segfault. Das passiert nur wenn dein Programm auf ein Objekt oder Variable zugreift für das es keine Zugriffserlaubnis besitzt.

Meint:
Eine Variable wurde nicht korrekt initialisiert und Du versuchst diese zu nutzen oder ein Arrayindex wurde überschritten (deine for Schleife versucht mehr Elemente mit printf auszugeben als da sind).

Wenn Du mit MinGW arbeitest, dann nutze den Debugger deiner IDE oder den Kommandozeilen Debugger GNU gdb, der sagt Dir genau was passiert.

ps: Immer Exceptions abfangen, niemals einfach
eskalieren lassen, macht die Sache generell eher schwieriger.

Antworten