Problema 1:incompatibilidade de ID de usuário
Lendo nas entrelinhas, parece que você está tentando depurar uma instância do PostgreSQL que está sendo executada como
postgres
usuário ou um ID de usuário diferente do seu. Daí sua tentativa de usar sudo
. Isso é doloroso, especialmente ao usar um IDE como o Eclipse. Com
gdb
simples você pode apenas sudo
o comando gdb para o uid desejado, por exemplo sudo -u postgres -p 12345
para anexar ao pid 12345 executando como usuário postgres
. Isso não funcionará com o Eclipse. Na verdade, executá-lo com sudo
provavelmente deixou seu espaço de trabalho com algumas permissões de arquivo confusas; corre:sudo chown -R ravi /home/ravi/workspace/
para corrigir a propriedade do arquivo.
Se você quiser depurar processos em outros IDs de usuário com o Eclipse, você precisará descobrir como fazer o Eclipse executar
gdb
com sudo. não apenas execute todo o Eclipse com sudo
. Problema 2:Tentando executar o PostgreSQL sob o controle do Eclipse
Este:
sugere que você também está tentando deixar o Eclipse iniciar o
postgres
diretamente. Isso é muito útil se você estiver tentando depurar o postmaster , mas como você está falando sobre o planejador de consultas, fica claro que deseja depurar um back-end específico. Iniciar o postmaster no Eclipse é inútil para isso, você será anexado ao processo errado. Eu acho que você provavelmente precisa ler a documentação interna do PostgreSQL:
- Tour do PostgreSQL Internals
- Interiores do PostgreSQL por meio de imagens
- Capítulo de documentação - internos
Fazendo certo
Aqui está o que você precisa fazer - esboço aproximado, já que usei apenas o Eclipse para desenvolvimento em Java e fiz meu desenvolvimento em C com vim e gdb:
-
Compile uma compilação de depuração do PostgreSQL (compilado com./configure --enable-debug
e de preferência tambémCFLAGS="-ggdb -Og -fno-omit-frame-pointer"
). Especifique um--prefix
dentro do seu homedir, como--prefix=$HOME/postgres-debug
-
Coloque obin
da sua compilação de depuração diretório primeiro em seuPATH
, por exemplo.export PATH=$HOME/postgres-debug/bin:$PATH
-
initdb -U postgres -D $HOME/postgres-debug-data
uma nova instância do PostgreSQL da sua compilação de depuração
-
Inicie a nova instância comPGPORT=5599 pg_ctl -D $HOME/postgres-debug-data -l $HOME/postgres-debug-data.log -w start
-
Conecte-se comPGPORT=5599 psql postgres
-
Faça qualquer configuração que você precisa fazer
-
Obtenha o ID do processo de back-end comSELECT pg_backend_pid()
em umpsql
sessão. Deixe essa sessão aberta; é aquele que você estará depurando.
-
Anexe o depurador do Eclipse a esse ID de processo, usando o projeto Eclipse que contém o código-fonte da extensão PostgreSQL que você está depurando. Certifique-se de que o Eclipse esteja configurado para encontrar o código-fonte do PostgreSQL com o qual você compilou também (não faço ideia de como fazer isso, consulte o manual).
-
Defina os pontos de interrupção desejados e retome a execução
-
Nopsql
sessão, faça o que for necessário para que sua extensão seja executada e atinja o ponto de interrupção
-
Quando a execução pausa no ponto de interrupção no Eclipse, depure conforme desejado.
Equívocos básicos?
Além disso, caso você esteja realmente confuso sobre como tudo isso funciona:PostgreSQL é uma aplicação cliente/servidor. Se você estiver tentando depurar um programa cliente que usa libpq ou odbc e espera que um ponto de interrupção seja acionado em algum código de extensão de backend do PostgreSQL, isso não acontecerá. O aplicativo cliente se comunica com o PostgreSQL por meio de um soquete TCP/IP. É um programa separado.
gdb
não pode definir pontos de interrupção no servidor PostgreSQL quando conectado ao cliente, pois são programas separados. Se você deseja depurar o servidor, você precisa anexar o gdb ao servidor. PostgreSQL usa um processo por conexão, então você tem que anexar gdb ao correto processo do servidor. É por isso que eu disse para usar SELECT pg_backend_pid()
acima e anexe ao ID do processo. Consulte a documentação interna vinculada acima e:
- Site PostgreSQL - codificação
- wiki do PostgreSQL - recursos do desenvolvedor
- Perguntas frequentes do desenvolvedor
- Anexando gdb a um back-end no linux/bsd/unix