sql >> Base de Datos >  >> RDS >> PostgreSQL

puntos de interrupción en eclipse usando postgresql

Problema 1:discrepancia de ID de usuario

Leyendo entre líneas, parece que está intentando depurar una instancia de PostgreSQL que se ejecuta como postgres usuario, o una identificación de usuario diferente a la suya de todos modos. De ahí su intento de usar sudo .

Eso es doloroso, especialmente cuando se usa un IDE como Eclipse. Con simple gdb puedes simplemente sudo el comando gdb al uid deseado, p. sudo -u postgres -p 12345 para adjuntar a pid 12345 ejecutándose como usuario postgres . Esto no funcionará con Eclipse. De hecho, ejecutarlo con sudo probablemente haya dejado su espacio de trabajo con algunos permisos de archivo en mal estado; ejecutar:

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

para corregir la propiedad del archivo.

Si desea depurar procesos bajo otras ID de usuario con Eclipse, deberá descubrir cómo hacer que Eclipse ejecute gdb con sudo. no simplemente ejecuta todo Eclipse con sudo .

Problema 2:intentar ejecutar PostgreSQL bajo el control de Eclipse

esto:

sugiere que también está intentando permitir que Eclipse inicie postgres directamente. Eso es muy útil si está tratando de depurar el postmaster , pero como está hablando del planificador de consultas, está claro que desea depurar un backend en particular. Lanzar el postmaster bajo Eclipse es inútil para eso, estarás conectado al proceso incorrecto.

Creo que probablemente necesites leer la documentación sobre las partes internas de PostgreSQL:

Hacerlo bien

Esto es lo que debe hacer:un resumen general, ya que solo he usado Eclipse para el desarrollo de Java y hago mi desarrollo en C con vim y gdb:

  • Compile una construcción de depuración de PostgreSQL (compilado con ./configure --enable-debug y preferiblemente también CFLAGS="-ggdb -Og -fno-omit-frame-pointer" ). Especifique un --prefix dentro de su homedir, como --prefix=$HOME/postgres-debug

  • Coloque el bin de su compilación de depuración directorio primero en su PATH , p.ej. export PATH=$HOME/postgres-debug/bin:$PATH

  • initdb -U postgres -D $HOME/postgres-debug-data una nueva instancia de PostgreSQL de su compilación de depuración

  • Inicie la nueva instancia con PGPORT=5599 pg_ctl -D $HOME/postgres-debug-data -l $HOME/postgres-debug-data.log -w start

  • Conéctese con PGPORT=5599 psql postgres

  • Haz cualquier configuración que necesites

  • Obtén el ID del proceso de back-end con SELECT pg_backend_pid() en un psql sesión. Deje esa sesión abierta; es el que estarás depurando.

  • Adjunte el depurador de Eclipse a ese ID de proceso, utilizando el proyecto de Eclipse que contiene el código fuente de la extensión de PostgreSQL que está depurando. Asegúrese de que Eclipse esté configurado para que también pueda encontrar el código fuente de PostgreSQL con el que compiló (no tengo idea de cómo hacerlo, consulte el manual).

  • Establezca los puntos de interrupción deseados y reanude la ejecución

  • En el psql sesión, haga lo que sea necesario para que su extensión se ejecute y alcance el punto de interrupción

  • Cuando la ejecución se detiene en el punto de interrupción en Eclipse, realice la depuración deseada.

¿Malentendidos básicos?

Además, en caso de que realmente confundido acerca de cómo funciona todo esto:PostgreSQL es una aplicación cliente/servidor. Si está intentando depurar un programa cliente que usa libpq u odbc, y esperando que se active un punto de interrupción en algún código de extensión de back-end de PostgreSQL, eso no va a suceder. La aplicación cliente se comunica con PostgreSQL a través de un socket TCP/IP. Es un programa aparte. gdb no puede establecer puntos de interrupción en el servidor PostgreSQL cuando está conectado al cliente, porque son programas separados. Si desea depurar el servidor, debe adjuntar gdb al servidor. PostgreSQL usa un proceso por conexión, por lo que debe adjuntar gdb al correcto proceso del servidor. Es por eso que dije usar SELECT pg_backend_pid() anterior y adjúntelo al ID del proceso.

Consulte la documentación interna vinculada anteriormente y: