PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Haltepunkte in Eclipse mit postgresql

Problem 1:Benutzer-ID stimmt nicht überein

Wenn Sie zwischen den Zeilen lesen, klingt es so, als ob Sie versuchen, eine PostgreSQL-Instanz zu debuggen, die als postgres ausgeführt wird Benutzer oder sowieso eine andere Benutzer-ID als Ihre eigene. Daher Ihr Versuch, sudo zu verwenden .

Das ist schmerzhaft, besonders wenn Sie eine IDE wie Eclipse verwenden. Mit einfachem gdb Sie können einfach sudo den gdb-Befehl auf die gewünschte uid, z.B. sudo -u postgres -p 12345 zum Anhängen an PID 12345, ausgeführt als Benutzer postgres . Dies funktioniert nicht mit Eclipse. Tatsächlich wird es mit sudo ausgeführt hat Ihren Arbeitsbereich wahrscheinlich mit einigen durcheinandergebrachten Dateiberechtigungen verlassen; ausführen:

sudo chown -R ravi /home/ravi/workspace/

um den Dateibesitz zu beheben.

Wenn Sie Prozesse unter anderen Benutzer-IDs mit Eclipse debuggen möchten, müssen Sie herausfinden, wie Sie Eclipse dazu bringen, gdb auszuführen mit sudo. nicht Führen Sie einfach Eclipse mit sudo aus .

Problem 2:Versuch, PostgreSQL unter der Kontrolle von Eclipse auszuführen

Dies:

schlägt vor, dass Sie auch versuchen, Eclipse postgres starten zu lassen direkt. Das ist sehr nützlich, wenn Sie versuchen, den postmaster zu debuggen , aber da Sie über den Abfrageplaner sprechen, ist klar, dass Sie ein bestimmtes Backend debuggen möchten. Das Starten des Postmasters unter Eclipse ist dafür nutzlos, Sie werden mit dem falschen Prozess verbunden.

Ich denke, Sie müssen wahrscheinlich die Dokumentation zu den Interna von PostgreSQL lesen:

Es richtig machen

Hier ist, was Sie tun müssen – ein grober Überblick, da ich Eclipse nur für die Java-Entwicklung verwendet habe und meine C-Entwicklung mit vim und gdb mache:

  • Kompilieren Sie einen Debug-Build von PostgreSQL (kompiliert mit ./configure --enable-debug und vorzugsweise auch CFLAGS="-ggdb -Og -fno-omit-frame-pointer" ). Geben Sie ein --prefix an innerhalb Ihres Homedir, wie --prefix=$HOME/postgres-debug

  • Legen Sie den bin Ihres Debug-Builds ab Verzeichnis zuerst auf Ihrem PATH , z.B. export PATH=$HOME/postgres-debug/bin:$PATH

  • initdb -U postgres -D $HOME/postgres-debug-data eine neue Instanz von PostgreSQL aus Ihrem Debug-Build

  • Starten Sie die neue Instanz mit PGPORT=5599 pg_ctl -D $HOME/postgres-debug-data -l $HOME/postgres-debug-data.log -w start

  • Verbinden Sie sich mit PGPORT=5599 psql postgres

  • Nehmen Sie die erforderlichen Einstellungen vor

  • Rufen Sie die Backend-Prozess-ID mit SELECT pg_backend_pid() ab in einem psql Sitzung. Lassen Sie diese Sitzung offen; es ist derjenige, den Sie debuggen werden.

  • Hängen Sie den Debugger von Eclipse an diese Prozess-ID an, indem Sie das Eclipse-Projekt verwenden, das den Quellcode der PostgreSQL-Erweiterung enthält, den Sie debuggen. Stellen Sie sicher, dass Eclipse so konfiguriert ist, dass es auch den PostgreSQL-Quellcode finden kann, mit dem Sie kompiliert haben (keine Ahnung, wie das geht, siehe Handbuch).

  • Setzen Sie beliebige Breakpoints und setzen Sie die Ausführung fort

  • Im psql tun Sie alles, was Sie tun müssen, um Ihre Erweiterung auszuführen und den Haltepunkt zu erreichen

  • Wenn die Ausführung am Haltepunkt in Eclipse angehalten wird, debuggen Sie wie gewünscht.

Grundlegende Missverständnisse?

Auch für den Fall, dass Sie es wirklich sind verwirrt darüber, wie das alles funktioniert:PostgreSQL ist eine Client/Server-Anwendung. Wenn Sie versuchen, ein Client-Programm zu debuggen das libpq oder odbc verwendet und erwartet, dass ein Haltepunkt in einem PostgreSQL-Backend-Erweiterungscode ausgelöst wird, wird das nicht passieren. Die Clientanwendung kommuniziert mit PostgreSQL über einen TCP/IP-Socket. Es ist ein separates Programm. gdb kann keine Haltepunkte im PostgreSQL-Server setzen, wenn er mit dem Client verbunden ist, da es sich um separate Programme handelt. Wenn Sie den Server debuggen möchten, müssen Sie gdb an den Server anhängen. PostgreSQL verwendet einen Prozess pro Verbindung, also müssen Sie gdb an den richtigen anhängen Serverprozess. Deshalb habe ich gesagt, dass ich SELECT pg_backend_pid() verwenden soll oben und an die Prozess-ID anhängen.

Siehe die oben verlinkte interne Dokumentation und: