Problème 1 :Incompatibilité d'ID utilisateur
En lisant entre les lignes, on dirait que vous essayez de déboguer une instance PostgreSQL qui s'exécute en tant que postgres
utilisateur, ou un ID utilisateur différent du vôtre de toute façon. D'où votre tentative d'utiliser sudo
.
C'est douloureux, surtout lorsque vous utilisez un IDE comme Eclipse. Avec gdb
simple vous pouvez simplement sudo
la commande gdb à l'uid souhaité, par ex. sudo -u postgres -p 12345
pour attacher au pid 12345 en tant qu'utilisateur postgres
. Cela ne fonctionnera pas avec Eclipse. En fait, l'exécuter avec sudo
a probablement quitté votre espace de travail avec des autorisations de fichiers erronées ; exécuter :
sudo chown -R ravi /home/ravi/workspace/
pour corriger la propriété du fichier.
Si vous souhaitez déboguer des processus sous d'autres ID utilisateur avec Eclipse, vous devrez comprendre comment faire exécuter Eclipse gdb
avec sudo. Ne pas lancez simplement tout Eclipse avec sudo
.
Problème 2 :Essayer d'exécuter PostgreSQL sous le contrôle d'Eclipse
Ceci :
suggère que vous essayez également de laisser Eclipse démarrer postgres
directement. C'est très utile si vous essayez de déboguer le postmaster , mais puisque vous parlez du planificateur de requêtes, il est clair que vous souhaitez déboguer un backend particulier. Lancer le postmaster sous Eclipse ne sert à rien pour cela, vous serez rattaché au mauvais processus.
Je pense que vous devez probablement lire la documentation sur les composants internes de PostgreSQL :
- Visite des composants internes de PostgreSQL
- Les éléments internes de PostgreSQL via des images
- Chapitre de la documentation - éléments internes
Faire les choses correctement
Voici ce que vous devez faire - aperçu général, puisque je n'ai utilisé Eclipse que pour le développement Java et que je fais mon développement C avec vim et gdb :
-
Compiler une version de débogage de PostgreSQL (compilé avec
./configure --enable-debug
et de préférence aussiCFLAGS="-ggdb -Og -fno-omit-frame-pointer"
). Spécifiez un--prefix
dans votre répertoire personnel, comme--prefix=$HOME/postgres-debug
-
Mettez le
bin
de votre build de débogage répertoire d'abord sur votrePATH
, par exemple.export PATH=$HOME/postgres-debug/bin:$PATH
-
initdb -U postgres -D $HOME/postgres-debug-data
une nouvelle instance de PostgreSQL à partir de votre version de débogage -
Démarrez la nouvelle instance avec
PGPORT=5599 pg_ctl -D $HOME/postgres-debug-data -l $HOME/postgres-debug-data.log -w start
-
Connectez-vous avec
PGPORT=5599 psql postgres
-
Effectuez la configuration dont vous avez besoin
-
Obtenez l'ID du processus backend avec
SELECT pg_backend_pid()
dans unpsql
session. Laissez cette session ouverte ; c'est celui que vous allez déboguer. -
Attachez le débogueur d'Eclipse à cet ID de processus, en utilisant le projet Eclipse qui contient le code source de l'extension PostgreSQL que vous déboguez. Assurez-vous qu'Eclipse est configuré pour qu'il puisse également trouver le code source PostgreSQL avec lequel vous avez compilé (aucune idée de comment faire, consultez le manuel).
-
Définissez les points d'arrêt souhaités et reprenez l'exécution
-
Dans le
psql
session, faites tout ce que vous devez faire pour que votre extension s'exécute et atteigne le point d'arrêt -
Lorsque l'exécution s'interrompt au point d'arrêt dans Eclipse, déboguez comme vous le souhaitez.
Des malentendus de base ?
Aussi, au cas où vous seriez vraiment confus quant à la façon dont tout cela fonctionne :PostgreSQL est une application client/serveur. Si vous essayez de déboguer un programme client qui utilise libpq ou odbc, et s'attendre à ce qu'un point d'arrêt se déclenche dans un code d'extension backend PostgreSQL, cela ne se produira pas. L'application cliente communique avec PostgreSQL via un socket TCP/IP. C'est un programme distinct. gdb
ne peut pas définir de points d'arrêt dans le serveur PostgreSQL lorsqu'il est connecté au client, car ce sont des programmes distincts. Si vous souhaitez déboguer le serveur, vous devez attacher gdb au serveur. PostgreSQL utilise un processus par connexion, vous devez donc attacher gdb au correct processus serveur. C'est pourquoi j'ai dit d'utiliser SELECT pg_backend_pid()
ci-dessus, et joignez-le à l'ID de processus.
Voir la documentation interne liée ci-dessus, et :
- Site PostgreSQL - codage
- Wiki PostgreSQL – ressources pour les développeurs
- FAQ pour les développeurs
- Attacher gdb à un backend sous linux/bsd/unix