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:
- Recorrido por los componentes internos de PostgreSQL
- Interiores de PostgreSQL a través de imágenes
- Capítulo de documentación:aspectos internos
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énCFLAGS="-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 suPATH
, 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 unpsql
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:
- Sitio de PostgreSQL:codificación
- wiki de PostgreSQL:recursos para desarrolladores
- Preguntas frecuentes del desarrollador
- Adjuntar gdb a un backend en linux/bsd/unix