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 auchCFLAGS="-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 IhremPATH
, 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 einempsql
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:
- PostgreSQL-Site - Codierung
- PostgreSQL-Wiki - Entwicklerressourcen
- Entwickler-FAQ
- Anhängen von gdb an ein Backend unter Linux/BSD/Unix