PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

punti di interruzione in eclipse usando postgresql

Problema 1:ID utente non corrispondente

Leggendo tra le righe, sembra che tu stia tentando di eseguire il debug di un'istanza PostgreSQL in esecuzione come postgres utente o comunque un ID utente diverso dal tuo. Da qui il tuo tentativo di usare sudo .

È doloroso, specialmente quando si utilizza un IDE come Eclipse. Con semplice gdb puoi semplicemente sudo il comando gdb all'uid desiderato, ad es. sudo -u postgres -p 12345 da allegare al pid 12345 in esecuzione come utente postgres . Questo non funzionerà con Eclipse. In effetti, eseguirlo con sudo probabilmente ha lasciato il tuo spazio di lavoro con alcuni permessi sui file incasinati; corri:

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

per correggere la proprietà del file.

Se vuoi eseguire il debug di processi con altri ID utente con Eclipse, dovrai capire come fare in modo che Eclipse esegua gdb con sudo. non esegui tutto Eclipse con sudo .

Problema 2:tentativo di eseguire PostgreSQL sotto il controllo di Eclipse

Questo:

suggerisce che stai anche tentando di consentire a Eclipse di avviare postgres direttamente. È molto utile se stai cercando di eseguire il debug del postmaster , ma dal momento che stai parlando del pianificatore di query è chiaro che desideri eseguire il debug di un particolare back-end. Avviare il postmaster in Eclipse è inutile, verrai collegato al processo sbagliato.

Penso che probabilmente dovrai leggere la documentazione sugli interni di PostgreSQL:

Fallo bene

Ecco cosa devi fare:una bozza, dal momento che ho usato Eclipse solo per lo sviluppo Java e faccio il mio sviluppo C con vim e gdb:

  • Compila una build di debug di PostgreSQL (compilato con ./configure --enable-debug e preferibilmente anche CFLAGS="-ggdb -Og -fno-omit-frame-pointer" ). Specifica un --prefix all'interno della tua homedir, come --prefix=$HOME/postgres-debug

  • Inserisci il bin della tua build di debug directory prima sul tuo PATH , per esempio. export PATH=$HOME/postgres-debug/bin:$PATH

  • initdb -U postgres -D $HOME/postgres-debug-data una nuova istanza di PostgreSQL dalla tua build di debug

  • Avvia la nuova istanza con PGPORT=5599 pg_ctl -D $HOME/postgres-debug-data -l $HOME/postgres-debug-data.log -w start

  • Connettiti con PGPORT=5599 psql postgres

  • Fai qualsiasi configurazione tu debba fare

  • Ottieni l'ID del processo di back-end con SELECT pg_backend_pid() in un psql sessione. Lascia quella sessione aperta; è quello di cui eseguirai il debug.

  • Collega il debugger di Eclipse a quell'ID processo, utilizzando il progetto Eclipse che contiene il codice sorgente dell'estensione PostgreSQL di cui stai eseguendo il debug. Assicurati che Eclipse sia configurato in modo che possa trovare anche il codice sorgente PostgreSQL con cui hai compilato (non ho idea di come farlo, vedi il manuale).

  • Imposta i punti di interruzione desiderati e riprendi l'esecuzione

  • Nel psql sessione, fai tutto il necessario per far funzionare la tua estensione e raggiungere il punto di interruzione

  • Quando l'esecuzione si interrompe al punto di interruzione in Eclipse, eseguire il debug come desiderato.

Incomprensioni di base?

Inoltre, nel caso tu lo sia davvero confuso su come funziona tutto questo:PostgreSQL è un'applicazione client/server. Se stai tentando di eseguire il debug di un programma client che utilizza libpq o odbc e si aspetta che un punto di interruzione venga attivato in alcuni codici di estensione del back-end PostgreSQL, ciò non accadrà. L'applicazione client comunica con PostgreSQL tramite un socket TCP/IP. È un programma separato. gdb non può impostare punti di interruzione nel server PostgreSQL quando è connesso al client, perché sono programmi separati. Se vuoi eseguire il debug del server, devi collegare gdb al server. PostgreSQL utilizza un processo per connessione, quindi devi allegare gdb a correct processo del server. Ecco perché ho detto di usare SELECT pg_backend_pid() sopra e allegare all'ID del processo.

Vedi la documentazione interna collegata sopra e: