Проблем 1:Несъответствие на потребителския идентификатор
Четейки между редовете, изглежда, че се опитвате да отстраните грешки в екземпляр на PostgreSQL, който се изпълнява като postgres
потребител или различно потребителско име от вашето. Оттук и вашият опит да използвате sudo
.
Това е болезнено, особено когато използвате IDE като Eclipse. С обикновен gdb
можете просто да sudo
командата gdb към желания uid, напр. sudo -u postgres -p 12345
за прикачване към pid 12345, работещ като потребител postgres
. Това няма да работи с Eclipse. Всъщност, стартирайки го с sudo
вероятно е напуснал работното ви пространство с някои объркани разрешения за файлове; стартирайте:
sudo chown -R ravi /home/ravi/workspace/
за коригиране на собствеността върху файла.
Ако искате да отстранявате грешки в процеси под други потребителски идентификатори с Eclipse, ще трябва да разберете как да накарате Eclipse да изпълнява gdb
със sudo. Не просто стартирайте целия Eclipse с sudo
.
Проблем 2:Опит за стартиране на PostgreSQL под контрола на Eclipse
Това:
предполага, че също се опитвате да позволите на Eclipse да стартира postgres
директно. Това е много полезно, ако се опитвате да отстраните грешки в postmaster , но тъй като говорите за планиране на заявки, ясно е, че искате да отстраните грешки в определен бекенд. Стартирането на postmaster под Eclipse е безполезно за това, ще бъдете прикрепени към грешен процес.
Мисля, че вероятно трябва да прочетете документацията за вътрешността на PostgreSQL:
- Обиколка на вътрешните елементи на PostgreSQL
- Вътрешни елементи на PostgreSQL чрез снимки
- Глава за документация - вътрешни елементи
Правим го правилно
Ето какво трябва да направите - грубо очертание, тъй като съм използвал Eclipse само за разработка на Java и правя моята разработка на C с vim и gdb:
-
Компилирайте компилация за отстраняване на грешки на PostgreSQL (компилиран с
./configure --enable-debug
и за предпочитане същоCFLAGS="-ggdb -Og -fno-omit-frame-pointer"
). Посочете--prefix
във вашия homedir, като--prefix=$HOME/postgres-debug
-
Поставете
bin
на вашата компилация за отстраняване на грешки първа директория във вашияPATH
, напр.export PATH=$HOME/postgres-debug/bin:$PATH
-
initdb -U postgres -D $HOME/postgres-debug-data
нов екземпляр на PostgreSQL от компилацията ви за отстраняване на грешки -
Стартирайте новото копие с
PGPORT=5599 pg_ctl -D $HOME/postgres-debug-data -l $HOME/postgres-debug-data.log -w start
-
Свържете се с
PGPORT=5599 psql postgres
-
Направете каквото трябва да направите
-
Вземете идентификатора на бекенд процеса с
SELECT pg_backend_pid()
вpsql
сесия. Оставете тази сесия отворена; това е този, който ще отстранявате грешки. -
Прикрепете дебъгера на Eclipse към този ID на процеса, като използвате проекта Eclipse, който съдържа изходния код на разширението на PostgreSQL, който дебъгвате. Уверете се, че Eclipse е конфигуриран така, че да може да намира изходния код на PostgreSQL, с който сте компилирали (нямате представа как да направите това, вижте ръководството).
-
Задайте желаните точки на прекъсване и възобновете изпълнението
-
В
psql
сесия, направете каквото трябва, за да стартирате разширението си и да достигнете точката на прекъсване -
Когато изпълнението спре в точката на прекъсване в Eclipse, отстранете грешки по желание.
Основни недоразумения?
Освен това, в случай че наистина сте объркан как работи всичко това:PostgreSQL е клиент/сървър приложение. Ако се опитвате да отстраните грешки в клиентска програма който използва libpq или odbc, и очаквайки точка на прекъсване да се задейства в някакъв код за разширение на бекенда на PostgreSQL, това няма да се случи. Клиентското приложение комуникира с PostgreSQL през TCP/IP сокет. Това е отделна програма. gdb
не може да зададе точки на прекъсване в PostgreSQL сървъра, когато е свързан към клиента, защото те са отделни програми. Ако искате да отстраните грешки в сървъра, трябва да прикачите gdb към сървъра. PostgreSQL използва един процес на връзка, така че трябва да прикачите gdb към правилния сървърен процес. Ето защо казах да използвам SELECT pg_backend_pid()
по-горе и прикрепете към идентификатора на процеса.
Вижте вътрешната документация, свързана по-горе, и:
- PostgreSQL сайт - кодиране
- PostgreSQL wiki - ресурси за разработчици
- ЧЗВ за разработчици
- Прикачване на gdb към бекенд на linux/bsd/unix