sql >> Databasteknik >  >> RDS >> PostgreSQL

brytpunkter i eclipse med postgresql

Problem 1:Användar-ID matchar inte

När man läser mellan raderna låter det som att du försöker felsöka en PostgreSQL-instans som körs som postgres användare, eller ett annat användar-ID än ditt eget ändå. Därav ditt försök att använda sudo .

Det är smärtsamt, speciellt när du använder en IDE som Eclipse. Med vanlig gdb du kan bara sudo gdb-kommandot till önskad uid, t.ex. sudo -u postgres -p 12345 att bifoga till pid 12345 som körs som användare postgres . Detta kommer inte att fungera med Eclipse. Faktum är att köra den med sudo har förmodligen lämnat din arbetsyta med några trassliga filbehörigheter; kör:

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

för att fixa filägande.

Om du vill felsöka processer under andra användar-ID:n med Eclipse, måste du ta reda på hur du får Eclipse att köra gdb med sudo. Gör inte kör bara hela Eclipse med sudo .

Problem 2:Försöker köra PostgreSQL under kontroll av Eclipse

Detta:

föreslår att du också försöker låta Eclipse starta postgres direkt. Det är mycket användbart om du försöker felsöka postmaster , men eftersom du pratar om frågeplaneraren är det uppenbart att du vill felsöka en viss backend. Att starta postmastern under Eclipse är meningslöst för det, du kommer att kopplas till fel process.

Jag tror att du förmodligen behöver läsa dokumentationen om PostgreSQL:s interna:

Gör det rätt

Här är vad du behöver göra - grov översikt, eftersom jag bara har använt Eclipse för Java-utveckling och gör min C-utveckling med vim och gdb:

  • Kompilera en debug build av PostgreSQL (kompilerad med ./configure --enable-debug och helst även CFLAGS="-ggdb -Og -fno-omit-frame-pointer" ). Ange ett --prefix i din hemkatalog, som --prefix=$HOME/postgres-debug

  • Sätt din debug builds bin katalogen först på din PATH , t.ex. export PATH=$HOME/postgres-debug/bin:$PATH

  • initdb -U postgres -D $HOME/postgres-debug-data en ny instans av PostgreSQL från ditt felsökningsbygge

  • Starta den nya instansen med PGPORT=5599 pg_ctl -D $HOME/postgres-debug-data -l $HOME/postgres-debug-data.log -w start

  • Anslut med PGPORT=5599 psql postgres

  • Gör vad du än behöver göra

  • Skaffa backend-processens ID med SELECT pg_backend_pid() i en psql session. Lämna den sessionen öppen; det är den du ska felsöka.

  • Bifoga Eclipses debugger till det process-ID:t med Eclipse-projektet som innehåller PostgreSQL-tilläggets källkod som du felsöker. Se till att Eclipse är konfigurerad så att den kan hitta PostgreSQL-källkoden du kompilerade med också (ingen aning om hur man gör det, se manualen).

  • Ställ in önskade brytpunkter och återuppta körningen

  • I psql session, gör allt du behöver göra för att få ditt tillägg att köra och nå brytpunkten

  • När körningen pausas vid brytpunkten i Eclipse, felsök efter önskemål.

Grundläggande missförstånd?

Även om du är på riktigt förvirrad över hur allt detta fungerar:PostgreSQL är en klient/serverapplikation. Om du försöker felsöka ett klientprogram som använder libpq eller odbc, och förväntar sig att en brytpunkt ska triggas i någon PostgreSQL-backend-tilläggskod, det kommer inte att hända. Klientapplikationen kommunicerar med PostgreSQL via en TCP/IP-socket. Det är ett separat program. gdb kan inte ställa in brytpunkter i PostgreSQL-servern när den är ansluten till klienten, eftersom de är separata program. Om du vill felsöka servern måste du koppla gdb till servern. PostgreSQL använder en process per anslutning, så du måste bifoga gdb till rätt serverprocess. Det är därför jag sa att jag skulle använda SELECT pg_backend_pid() ovan och bifoga till process-ID.

Se den interna dokumentationen länkad ovan och:



  1. Generera ett slumpmässigt datum i Oracle med DBMS_RANDOM

  2. Kan relationsdatabas skalas horisontellt

  3. Hur genererar man automatiskt unikt ID i SQL som UID12345678?

  4. Hur man delar skrivskyddade och läs-skrivtransaktioner med JPA och Hibernate