Sự cố 1:ID người dùng không khớp
Đọc giữa các dòng, có vẻ như bạn đang cố gỡ lỗi một phiên bản PostgreSQL đang chạy dưới dạng postgres
người dùng hoặc ID người dùng khác của riêng bạn. Do đó, bạn cố gắng sử dụng sudo
.
Điều đó thật khó chịu, đặc biệt là khi sử dụng một IDE như Eclipse. Với gdb
đơn giản bạn chỉ có thể sudo
lệnh gdb đến uid mong muốn, ví dụ:sudo -u postgres -p 12345
để đính kèm vào pid 12345 đang chạy với tư cách người dùng postgres
. Điều này sẽ không hoạt động với Eclipse. Trên thực tế, chạy nó với sudo
có thể đã rời khỏi không gian làm việc của bạn với một số quyền đối với tệp bị rối; chạy:
sudo chown -R ravi /home/ravi/workspace/
để sửa quyền sở hữu tệp.
Nếu bạn muốn gỡ lỗi các quy trình trong các ID người dùng khác bằng Eclipse, bạn sẽ cần tìm cách làm cho Eclipse chạy gdb
với sudo. Đ ừng chỉ cần chạy tất cả Eclipse với sudo
.
Sự cố 2:Cố gắng chạy PostgreSQL dưới sự kiểm soát của Eclipse
Cái này:
gợi ý rằng bạn cũng đang cố gắng để Eclipse khởi động postgres
trực tiếp. Điều đó rất hữu ích nếu bạn đang cố gắng gỡ lỗi postmaster , nhưng vì bạn đang nói về công cụ lập kế hoạch truy vấn nên rõ ràng bạn muốn gỡ lỗi một chương trình phụ trợ cụ thể. Việc khởi chạy quản trị viên bưu điện trong Eclipse là vô ích, bạn sẽ bị dính vào quy trình sai.
Tôi nghĩ bạn có thể cần đọc tài liệu về nội bộ của PostgreSQL:
Làm đúng
Đây là những gì bạn cần làm - phác thảo sơ bộ, vì tôi chỉ sử dụng Eclipse để phát triển Java và thực hiện phát triển C của tôi với vim và gdb:
-
Biên dịch một bản dựng gỡ lỗi của PostgreSQL (được biên dịch bằng
./configure --enable-debug
và tốt hơn nữa làCFLAGS="-ggdb -Og -fno-omit-frame-pointer"
). Chỉ định một--prefix
trong homedir của bạn, chẳng hạn như--prefix=$HOME/postgres-debug
-
Đặt
bin
của bản dựng gỡ lỗi của bạn thư mục đầu tiên trênPATH
của bạn , ví dụ.export PATH=$HOME/postgres-debug/bin:$PATH
-
initdb -U postgres -D $HOME/postgres-debug-data
một phiên bản mới của PostgreSQL từ bản dựng gỡ lỗi của bạn -
Bắt đầu phiên bản mới với
PGPORT=5599 pg_ctl -D $HOME/postgres-debug-data -l $HOME/postgres-debug-data.log -w start
-
Kết nối với
PGPORT=5599 psql postgres
-
Thực hiện bất kỳ thiết lập nào bạn cần làm
-
Nhận ID quy trình phụ trợ với
SELECT pg_backend_pid()
trong mộtpsql
phiên họp. Để phiên đó mở; đó là cái bạn sẽ gỡ lỗi. -
Đính kèm trình gỡ lỗi của Eclipse vào ID quy trình đó, sử dụng dự án Eclipse có chứa mã nguồn mở rộng PostgreSQL mà bạn đang gỡ lỗi. Đảm bảo rằng Eclipse được định cấu hình để nó cũng có thể tìm thấy mã nguồn PostgreSQL mà bạn đã biên dịch (không biết làm thế nào để làm điều đó, hãy xem hướng dẫn).
-
Đặt bất kỳ điểm ngắt mong muốn nào và tiếp tục thực thi
-
Trong
psql
, hãy làm bất cứ điều gì bạn cần làm để tiện ích mở rộng của bạn chạy và đạt đến điểm dừng -
Khi quá trình thực thi tạm dừng tại điểm ngắt trong Eclipse, hãy gỡ lỗi như mong muốn.
Những hiểu lầm cơ bản?
Ngoài ra, trong trường hợp bạn thực sự nhầm lẫn về cách tất cả điều này hoạt động:PostgreSQL là một ứng dụng máy khách / máy chủ. Nếu bạn đang cố gỡ lỗi một chương trình khách sử dụng libpq hoặc odbc và mong đợi một điểm ngắt để kích hoạt trong một số mã mở rộng phụ trợ PostgreSQL, điều đó sẽ không xảy ra. Ứng dụng khách giao tiếp với PostgreSQL qua ổ cắm TCP / IP. Đó là một chương trình riêng biệt. gdb
không thể đặt các điểm ngắt trong máy chủ PostgreSQL khi nó được kết nối với máy khách, vì chúng là các chương trình riêng biệt. Nếu bạn muốn gỡ lỗi máy chủ, bạn phải đính kèm gdb vào máy chủ. PostgreSQL sử dụng một quy trình cho mỗi kết nối, vì vậy bạn phải đính kèm gdb với đúng quy trình máy chủ. Đó là lý do tại sao tôi nói sử dụng SELECT pg_backend_pid()
ở trên và đính kèm với ID quy trình.
Xem tài liệu nội bộ được liên kết ở trên và:
- trang web PostgreSQL - mã hóa
- PostgreSQL wiki - tài nguyên dành cho nhà phát triển
- Câu hỏi thường gặp dành cho nhà phát triển
- Đính kèm gdb vào chương trình phụ trợ trên linux / bsd / unix