PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

points d'arrêt dans eclipse en utilisant postgresql

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 :

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 aussi CFLAGS="-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 votre PATH , 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 un psql 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 :