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:
- Prohlídka PostgreSQL Internals
- Interní informace PostgreSQL prostřednictvím obrázků
- Kapitola dokumentace – interní informace
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()
vpsql
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:
- Stránky PostgreSQL – kódování
- PostgreSQL wiki – zdroje pro vývojáře
- Nejčastější dotazy pro vývojáře
- Připojení gdb k backendu na linux/bsd/unix