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-debuget de préférence aussiCFLAGS="-ggdb -Og -fno-omit-frame-pointer"). Spécifiez un--prefixdans votre répertoire personnel, comme--prefix=$HOME/postgres-debug -
Mettez le
binde 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-dataune 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 unpsqlsession. 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
psqlsession, 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