PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

точки на прекъсване в eclipse с помощта на postgresql

Проблем 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:

Правим го правилно

Ето какво трябва да направите - грубо очертание, тъй като съм използвал 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() по-горе и прикрепете към идентификатора на процеса.

Вижте вътрешната документация, свързана по-горе, и:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да получите играч с максимален резултат от всяка група с помощта на SQL?

  2. Как Extract() работи в PostgreSQL

  3. Миграцията на Django 1.8 не може да преобразува id на колона в цяло число

  4. Преобразувайте колона bytea в OID, като запазвате стойностите

  5. Как да определите какъв тип индекс да използвате в Postgres?