PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

punkty przerwania w zaćmieniu przy użyciu postgresql

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:

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że CFLAGS="-ggdb -Og -fno-omit-frame-pointer" ). Określ --prefix w katalogu domowym, np. --prefix=$HOME/postgres-debug

  • Umieść bin swojej kompilacji debugowania najpierw w katalogu PATH , 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() w psql 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:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Funkcja PostgreSQL / procedura składowana CURRENT_TIMESTAMP nie zmienia się

  2. Sprawdź, czy w tablicy Postgres istnieje NULL

  3. Połącz wiele wierszy z różnymi datami z nakładającymi się zmiennymi (aby uchwycić daty pierwszej i ostatniej zmiany)

  4. Jak ustrukturyzować czat w aplikacji?

  5. Odpowiedź Json na konwersję daty i godziny postgresql Java postgresql