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-debuge de preferência tambémCFLAGS="-ggdb -Og -fno-omit-frame-pointer"). Especifique um--prefixdentro do seu homedir, como--prefix=$HOME/postgres-debug
-
Coloque obinda 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-datauma 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 umpsqlsessã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
-
Nopsqlsessã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