sql >> Database >  >> RDS >> PostgreSQL

breekpunten in eclipse met behulp van postgresql

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:

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 ook CFLAGS="-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 uw PATH , 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 een psql 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:



  1. cron job om oude gegevens uit postgres op debian te verwijderen

  2. geen overeenkomende unieke of primaire sleutel voor deze kolomlijst. De primaire sleutel bestaat wel

  3. Sessies beheren in Node.js met Passport, Redis en MySQL

  4. Kolomalias in een WHERE-clausule