sql >> Databáze >  >> RDS >> PostgreSQL

body přerušení v Eclipse pomocí postgresql

Problém 1:Neshoda ID uživatele

Při čtení mezi řádky to zní, jako byste se snažili ladit instanci PostgreSQL, která běží jako postgres uživatele nebo jiné ID uživatele, než je vaše vlastní. Proto se pokoušíte použít sudo .

To je bolestivé, zvláště při použití IDE, jako je Eclipse. S prostým gdb můžete jen sudo příkaz gdb na požadované uid, např. sudo -u postgres -p 12345 pro připojení k pid 12345 běžícímu jako uživatel postgres . Toto nebude fungovat s Eclipse. Ve skutečnosti to spustíte pomocí sudo pravděpodobně opustil váš pracovní prostor s nějakými zpackanými oprávněními k souboru; spustit:

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

opravit vlastnictví souboru.

Pokud chcete pomocí Eclipse ladit procesy pod jinými uživatelskými ID, budete muset zjistit, jak zajistit, aby Eclipse spouštělo gdb se sudo. Ne stačí spustit celý Eclipse pomocí sudo .

Problém 2:Pokus o spuštění PostgreSQL pod kontrolou Eclipse

Toto:

naznačuje, že se také pokoušíte nechat Eclipse spustit postgres přímo. To je velmi užitečné, pokud se pokoušíte ladit postmaster , ale protože mluvíte o plánovači dotazů, je jasné, že chcete ladit konkrétní backend. Na to je spuštění postmastera pod Eclipse k ničemu, budete připojeni ke špatnému procesu.

Myslím, že si pravděpodobně budete muset přečíst dokumentaci k interním informacím PostgreSQL:

Dělám to správně

Zde je to, co musíte udělat - hrubý nástin, protože Eclipse jsem používal pouze pro vývoj v Javě a vývoj v C jsem dělal pomocí vim a gdb:

  • Zkompilujte ladicí sestavení PostgreSQL (zkompilovaný s ./configure --enable-debug a nejlépe také CFLAGS="-ggdb -Og -fno-omit-frame-pointer" ). Zadejte --prefix ve vašem homedir, jako je --prefix=$HOME/postgres-debug

  • Umístěte bin vašeho sestavení ladění adresář nejprve na vaší PATH , např. export PATH=$HOME/postgres-debug/bin:$PATH

  • initdb -U postgres -D $HOME/postgres-debug-data nová instance PostgreSQL z vašeho sestavení ladění

  • Spusťte novou instanci pomocí PGPORT=5599 pg_ctl -D $HOME/postgres-debug-data -l $HOME/postgres-debug-data.log -w start

  • Připojte se pomocí PGPORT=5599 psql postgres

  • Proveďte jakékoli nastavení, které potřebujete

  • Získejte ID procesu backend pomocí SELECT pg_backend_pid() v psql zasedání. Nechte tuto relaci otevřenou; je to ten, který budete ladit.

  • Připojte ladicí program Eclipse k tomuto ID procesu pomocí projektu Eclipse, který obsahuje zdrojový kód rozšíření PostgreSQL, který ladíte. Ujistěte se, že je Eclipse nakonfigurováno tak, aby našlo zdrojový kód PostgreSQL, se kterým jste kompilovali (nemám ponětí, jak to udělat, podívejte se do manuálu).

  • Nastavte libovolné požadované zarážky a obnovte provádění

  • V psql relaci, udělejte vše, co potřebujete, aby se vaše rozšíření spustilo a dosáhlo bodu přerušení

  • Když se provádění pozastaví v bodě přerušení v Eclipse, proveďte ladění podle potřeby.

Základní nedorozumění?

Také pro případ, že skutečně zmatený z toho, jak to všechno funguje:PostgreSQL je aplikace klient/server. Pokud se pokoušíte ladit klientský program který používá libpq nebo odbc a očekává, že se v nějakém backendovém kódu rozšíření PostgreSQL spustí bod přerušení, to se nestane. Klientská aplikace komunikuje s PostgreSQL přes TCP/IP soket. Je to samostatný program. gdb nelze nastavit body přerušení na serveru PostgreSQL, když je připojen ke klientovi, protože se jedná o samostatné programy. Pokud chcete ladit server, musíte k serveru připojit gdb. PostgreSQL používá jeden proces na připojení, takže musíte připojit gdb ke správnému proces serveru. Proto jsem řekl, že mám použít SELECT pg_backend_pid() výše a připojte jej k ID procesu.

Viz výše uvedená interní dokumentace a:



  1. Jak odstranit duplikáty ze seznamu odděleného čárkami pomocí regexp_replace v Oracle?

  2. Jak vypustit sloupec s omezením?

  3. Vkládání dat pomocí vícerozměrného pole z více polí

  4. Jak zjistím umístění protokolu chyb démona MySQL?