PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

pontos de interrupção no eclipse usando postgresql

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:

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ém CFLAGS="-ggdb -Og -fno-omit-frame-pointer" ). Especifique um --prefix dentro do seu homedir, como --prefix=$HOME/postgres-debug

  • Coloque o bin da sua compilação de depuração diretório primeiro em seu PATH , 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 com PGPORT=5599 pg_ctl -D $HOME/postgres-debug-data -l $HOME/postgres-debug-data.log -w start

  • Conecte-se com PGPORT=5599 psql postgres

  • Faça qualquer configuração que você precisa fazer

  • Obtenha o ID do processo de back-end com SELECT pg_backend_pid() em um psql 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

  • No psql 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: