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 ävenCFLAGS="-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å dinPATH
, 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 enpsql
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:
- PostgreSQL-webbplats - kodning
- PostgreSQL-wiki - utvecklarresurser
- Frågor och svar för utvecklare
- Att koppla gdb till en backend på linux/bsd/unix