Masalah 1:ID Pengguna tidak cocok
Membaca yang tersirat, sepertinya Anda mencoba men-debug instance PostgreSQL yang berjalan sebagai postgres
pengguna, atau ID pengguna yang berbeda dengan milik Anda. Karenanya upaya Anda untuk menggunakan sudo
.
Itu menyakitkan, terutama saat menggunakan IDE seperti Eclipse. Dengan gdb
biasa Anda cukup sudo
perintah gdb ke uid yang diinginkan, mis. sudo -u postgres -p 12345
untuk melampirkan ke pid 12345 berjalan sebagai pengguna postgres
. Ini tidak akan bekerja dengan Eclipse. Bahkan, menjalankannya dengan sudo
mungkin meninggalkan ruang kerja Anda dengan beberapa izin file yang kacau; jalankan:
sudo chown -R ravi /home/ravi/workspace/
untuk memperbaiki kepemilikan file.
Jika Anda ingin men-debug proses di bawah ID pengguna lain dengan Eclipse, Anda harus mengetahui cara membuat Eclipse menjalankan gdb
dengan sudo. Jangan jangan jalankan saja semua Eclipse dengan sudo
.
Masalah 2:Mencoba menjalankan PostgreSQL di bawah kendali Eclipse
Ini:
menyarankan bahwa Anda juga mencoba untuk membiarkan Eclipse memulai postgres
secara langsung. Itu sangat berguna jika Anda mencoba men-debug postmaster , tetapi karena Anda berbicara tentang perencana kueri, jelas Anda ingin men-debug backend tertentu. Meluncurkan postmaster di bawah Eclipse tidak ada gunanya untuk itu, Anda akan dilampirkan ke proses yang salah.
Saya pikir Anda mungkin perlu membaca dokumentasi di internal PostgreSQL:
Melakukannya dengan benar
Inilah yang perlu Anda lakukan - garis besar, karena saya hanya menggunakan Eclipse untuk pengembangan Java dan melakukan pengembangan C saya dengan vim dan gdb:
-
Kompilasi build debug dari PostgreSQL (dikompilasi dengan
./configure --enable-debug
dan sebaiknya jugaCFLAGS="-ggdb -Og -fno-omit-frame-pointer"
). Tentukan--prefix
dalam homedir Anda, seperti--prefix=$HOME/postgres-debug
-
Letakkan
bin
build debug Anda direktori pertama diPATH
. Anda , misalnyaexport PATH=$HOME/postgres-debug/bin:$PATH
-
initdb -U postgres -D $HOME/postgres-debug-data
instance baru PostgreSQL dari build debug Anda -
Mulai instance baru dengan
PGPORT=5599 pg_ctl -D $HOME/postgres-debug-data -l $HOME/postgres-debug-data.log -w start
-
Terhubung dengan
PGPORT=5599 psql postgres
-
Lakukan penyiapan apa pun yang perlu Anda lakukan
-
Dapatkan ID proses backend dengan
SELECT pg_backend_pid()
dalampsql
sidang. Biarkan sesi itu terbuka; itu yang akan Anda debug. -
Lampirkan debugger Eclipse ke ID proses tersebut, menggunakan proyek Eclipse yang berisi kode sumber ekstensi PostgreSQL yang Anda debug. Pastikan Eclipse dikonfigurasi sehingga dapat menemukan kode sumber PostgreSQL yang Anda kompilasi juga (tidak tahu bagaimana melakukannya, lihat manual).
-
Setel breakpoint yang diinginkan dan lanjutkan eksekusi
-
Dalam
psql
sesi, lakukan apa pun yang perlu Anda lakukan untuk membuat ekstensi Anda berjalan dan mencapai titik henti sementara -
Saat eksekusi berhenti di breakpoint di Eclipse, debug sesuai keinginan.
Kesalahpahaman mendasar?
Juga, jika Anda benar-benar bingung tentang bagaimana semua ini bekerja:PostgreSQL adalah aplikasi klien/server. Jika Anda mencoba men-debug program klien yang menggunakan libpq atau odbc, dan mengharapkan breakpoint untuk dipicu di beberapa kode ekstensi backend PostgreSQL, itu tidak akan terjadi. Aplikasi klien berkomunikasi dengan PostgreSQL melalui soket TCP/IP. Ini adalah program yang terpisah. gdb
tidak dapat menyetel breakpoint di server PostgreSQL saat terhubung ke klien, karena keduanya adalah program yang terpisah. Jika Anda ingin men-debug server, Anda harus melampirkan gdb ke server. PostgreSQL menggunakan satu proses per koneksi, jadi Anda harus melampirkan gdb ke benar proses server. Itulah mengapa saya mengatakan untuk menggunakan SELECT pg_backend_pid()
di atas, dan lampirkan ke ID proses.
Lihat dokumentasi internal yang ditautkan di atas, dan:
- Situs PostgreSQL - pengkodean
- Wiki PostgreSQL - sumber daya pengembang
- FAQ Pengembang
- Memasang gdb ke backend di linux/bsd/unix