Problem 1:niezgodność identyfikatora użytkownika
Czytając między wierszami, wygląda na to, że próbujesz debugować instancję PostgreSQL, która działa jako postgres
użytkownika lub i tak inny identyfikator użytkownika niż Twój. Stąd twoja próba użycia sudo
.
To bolesne, zwłaszcza przy korzystaniu z IDE, takiego jak Eclipse. Ze zwykłym gdb
możesz po prostu sudo
polecenie gdb na żądany uid, np. sudo -u postgres -p 12345
dołączyć do pid 12345 działającego jako użytkownik postgres
. To nie będzie działać z Eclipse. W rzeczywistości uruchamiając go z sudo
prawdopodobnie opuścił twój obszar roboczy z pewnymi pomieszanymi uprawnieniami do plików; uruchom:
sudo chown -R ravi /home/ravi/workspace/
aby naprawić własność pliku.
Jeśli chcesz debugować procesy pod innymi identyfikatorami użytkowników za pomocą Eclipse, musisz dowiedzieć się, jak uruchomić Eclipse gdb
z sudo. Nie po prostu uruchom całe środowisko Eclipse za pomocą sudo
.
Problem 2:Próba uruchomienia PostgreSQL pod kontrolą Eclipse
To:
sugeruje, że próbujesz również pozwolić Eclipse uruchomić postgres
bezpośrednio. Jest to bardzo przydatne, jeśli próbujesz debugować postmastera , ale skoro mówisz o planerze zapytań, jasne jest, że chcesz debugować konkretny backend. Uruchamianie postmastera w środowisku Eclipse jest do tego bezużyteczne, zostaniesz przywiązany do niewłaściwego procesu.
Myślę, że prawdopodobnie musisz przeczytać dokumentację dotyczącą wewnętrznych elementów PostgreSQL:
- Przegląd elementów wewnętrznych PostgreSQL
- Wewnętrzne elementy PostgreSQL za pomocą zdjęć
- Rozdział dokumentacji – elementy wewnętrzne
Zrób to dobrze
Oto, co musisz zrobić - ogólny zarys, ponieważ używałem Eclipse tylko do programowania w Javie i robię programowanie w C za pomocą vim i gdb:
-
Skompiluj kompilację debugowania PostgreSQL (skompilowany z
./configure --enable-debug
a najlepiej takżeCFLAGS="-ggdb -Og -fno-omit-frame-pointer"
). Określ--prefix
w katalogu domowym, np.--prefix=$HOME/postgres-debug
-
Umieść
bin
swojej kompilacji debugowania najpierw w kataloguPATH
, np.export PATH=$HOME/postgres-debug/bin:$PATH
-
initdb -U postgres -D $HOME/postgres-debug-data
nowa instancja PostgreSQL z twojej kompilacji debugowania -
Uruchom nową instancję za pomocą
PGPORT=5599 pg_ctl -D $HOME/postgres-debug-data -l $HOME/postgres-debug-data.log -w start
-
Połącz się z
PGPORT=5599 psql postgres
-
Zrób wszystko, co musisz zrobić
-
Uzyskaj identyfikator procesu backendu za pomocą
SELECT pg_backend_pid()
wpsql
sesja. Pozostaw tę sesję otwartą; to ten, który będziesz debugować. -
Dołącz debuger Eclipse do tego identyfikatora procesu, korzystając z projektu Eclipse zawierającego kod źródłowy rozszerzenia PostgreSQL, który debugujesz. Upewnij się, że środowisko Eclipse jest skonfigurowane tak, aby mogło znaleźć również kod źródłowy PostgreSQL, z którym skompilowałeś (nie mam pojęcia, jak to zrobić, zobacz instrukcję).
-
Ustaw dowolne punkty przerwania i wznów wykonywanie
-
W
psql
sesji, zrób wszystko, co musisz, aby Twoje rozszerzenie działało i trafiało w punkt przerwania -
Gdy wykonanie zostanie zatrzymane w punkcie przerwania w środowisku Eclipse, debuguj zgodnie z potrzebami.
Podstawowe nieporozumienia?
Ponadto, jeśli naprawdę zdezorientowany, jak to wszystko działa:PostgreSQL to aplikacja klient/serwer. Jeśli próbujesz debugować program kliencki który używa libpq lub odbc i oczekuje, że punkt przerwania zostanie wyzwolony w jakimś kodzie rozszerzenia zaplecza PostgreSQL, tak się nie stanie. Aplikacja kliencka komunikuje się z PostgreSQL przez gniazdo TCP/IP. To osobny program. gdb
nie może ustawić punktów przerwań na serwerze PostgreSQL, gdy jest on podłączony do klienta, ponieważ są to osobne programy. Jeśli chcesz debugować serwer, musisz dołączyć gdb do serwera. PostgreSQL używa jednego procesu na połączenie, więc musisz dołączyć gdb do poprawnego proces serwera. Dlatego powiedziałem, aby użyć SELECT pg_backend_pid()
powyżej i dołącz do identyfikatora procesu.
Zobacz dokumentację wewnętrzną, do której link znajduje się powyżej, oraz:
- Witryna PostgreSQL – kodowanie
- Wiki PostgreSQL – zasoby dla programistów
- Najczęstsze pytania programistów
- Dołączanie gdb do backendu na linux/bsd/unix