Probleem 1:niet-overeenkomende gebruikers-ID
Als je tussen de regels door leest, klinkt het alsof je een PostgreSQL-instantie probeert te debuggen die wordt uitgevoerd als de postgres
gebruiker, of toch een andere gebruikers-ID dan die van u. Vandaar je poging om sudo
. te gebruiken .
Dat is pijnlijk, vooral bij het gebruik van een IDE zoals Eclipse. Met gewone gdb
je kunt gewoon sudo
het gdb-commando naar de gewenste uid, b.v. sudo -u postgres -p 12345
om toe te voegen aan pid 12345 uitgevoerd als gebruiker postgres
. Dit werkt niet met Eclipse. In feite, het uitvoeren met sudo
heeft waarschijnlijk uw werkruimte verlaten met een aantal verknoeide bestandspermissies; uitvoeren:
sudo chown -R ravi /home/ravi/workspace/
om het eigendom van bestanden te herstellen.
Als u met Eclipse processen onder andere gebruikers-ID's wilt debuggen, moet u uitzoeken hoe u Eclipse gdb
kunt laten uitvoeren. met sudo. Doe niet voer gewoon heel Eclipse uit met sudo
.
Probleem 2:PostgreSQL proberen uit te voeren onder controle van Eclipse
Dit:
suggereert dat je ook probeert Eclipse postgres
. te laten starten direct. Dat is erg handig als je de postmaster probeert te debuggen , maar aangezien je het hebt over de queryplanner, is het duidelijk dat je een bepaalde backend wilt debuggen. De postmaster starten onder Eclipse is daarvoor nutteloos, je zit vast aan het verkeerde proces.
Ik denk dat je waarschijnlijk de documentatie over de interne onderdelen van PostgreSQL moet lezen:
- Rondleiding door PostgreSQL-internals
- PostgreSQL internals door middel van afbeeldingen
- Documentatiehoofdstuk - internals
Het goed doen
Dit is wat je moet doen - ruwe schets, aangezien ik Eclipse alleen voor Java-ontwikkeling heb gebruikt en mijn C-ontwikkeling met vim en gdb heb gedaan:
-
Compileer een debug-build van PostgreSQL (samengesteld met
./configure --enable-debug
en bij voorkeur ookCFLAGS="-ggdb -Og -fno-omit-frame-pointer"
). Specificeer een--prefix
in je homedir, zoals--prefix=$HOME/postgres-debug
-
Plaats de
bin
. van je debug-build map eerst op uwPATH
, bijv.export PATH=$HOME/postgres-debug/bin:$PATH
-
initdb -U postgres -D $HOME/postgres-debug-data
een nieuwe instantie van PostgreSQL van uw debug-build -
Start de nieuwe instantie met
PGPORT=5599 pg_ctl -D $HOME/postgres-debug-data -l $HOME/postgres-debug-data.log -w start
-
Maak verbinding met
PGPORT=5599 psql postgres
-
Voer de instellingen uit die u moet doen
-
Haal de backend-proces-ID op met
SELECT pg_backend_pid()
in eenpsql
sessie. Laat die sessie open; het is degene die je gaat debuggen. -
Koppel de debugger van Eclipse aan die proces-ID, met behulp van het Eclipse-project dat de broncode van de PostgreSQL-extensie bevat die u aan het opsporen bent. Zorg ervoor dat Eclipse zo is geconfigureerd dat het ook de PostgreSQL-broncode kan vinden waarmee je hebt gecompileerd (geen idee hoe je dat moet doen, zie de handleiding).
-
Stel de gewenste onderbrekingspunten in en hervat de uitvoering
-
In de
psql
sessie, doe wat je moet doen om je extensie te laten werken en het breekpunt te bereiken -
Wanneer de uitvoering pauzeert bij het breekpunt in Eclipse, debug dan naar wens.
Basismisvattingen?
Ook voor het geval je echt . bent verward over hoe dit allemaal werkt:PostgreSQL is een client/server-toepassing. Als u probeert een clientprogramma te debuggen die libpq of odbc gebruikt en verwacht dat een breekpunt wordt geactiveerd in een of andere PostgreSQL-backend-extensiecode, dat gaat niet gebeuren. De clienttoepassing communiceert met PostgreSQL via een TCP/IP-socket. Het is een apart programma. gdb
kan geen onderbrekingspunten instellen in de PostgreSQL-server wanneer deze is verbonden met de client, omdat het afzonderlijke programma's zijn. Als u de server wilt debuggen, moet u gdb aan de server koppelen. PostgreSQL gebruikt één proces per verbinding, dus je moet gdb koppelen aan de juiste server proces. Daarom zei ik SELECT pg_backend_pid()
. te gebruiken hierboven en voeg deze toe aan de proces-ID.
Zie de interne documentatie die hierboven is gelinkt, en:
- PostgreSQL-site - codering
- PostgreSQL-wiki - bronnen voor ontwikkelaars
- Veelgestelde vragen voor ontwikkelaars
- Gdb koppelen aan een backend op linux/bsd/unix