समस्या 1:उपयोगकर्ता आईडी बेमेल
पंक्तियों के बीच पढ़ने पर, ऐसा लगता है कि आप किसी PostgreSQL उदाहरण को डीबग करने का प्रयास कर रहे हैं जो postgres
के रूप में चल रहा है उपयोगकर्ता, या वैसे भी आपके लिए एक अलग उपयोगकर्ता आईडी। इसलिए sudo
. का उपयोग करने का आपका प्रयास ।
यह दर्दनाक है, खासकर ग्रहण जैसे आईडीई का उपयोग करते समय। सादे gdb
. के साथ आप बस sudo
. कर सकते हैं वांछित यूआईडी के लिए जीडीबी कमांड, उदा। sudo -u postgres -p 12345
उपयोगकर्ता postgres
. के रूप में चल रहे pid 12345 से संलग्न करने के लिए . यह ग्रहण के साथ काम नहीं करेगा। वास्तव में, इसे sudo
. के साथ चलाना शायद आपके कार्यक्षेत्र को कुछ गड़बड़ फ़ाइल अनुमतियों के साथ छोड़ दिया है; भागो:
sudo chown -R ravi /home/ravi/workspace/
फ़ाइल स्वामित्व ठीक करने के लिए।
यदि आप एक्लिप्स के साथ अन्य उपयोगकर्ता आईडी के तहत प्रक्रियाओं को डीबग करना चाहते हैं, तो आपको यह पता लगाना होगा कि एक्लिप्स को कैसे चलाया जाए gdb
सुडो के साथ। नहीं करें बस सभी ग्रहण sudo
. के साथ चलाएं ।
समस्या 2:ग्रहण के नियंत्रण में PostgreSQL चलाने का प्रयास कर रहा है
यह:
सुझाव देता है कि आप ग्रहण को postgres
start शुरू करने देने का भी प्रयास कर रहे हैं सीधे। यदि आप पोस्टमास्टर को डीबग करने का प्रयास कर रहे हैं तो यह बहुत उपयोगी है , लेकिन चूंकि आप क्वेरी प्लानर के बारे में बात कर रहे हैं, यह स्पष्ट है कि आप किसी विशेष बैकएंड को डीबग करना चाहते हैं। एक्लिप्स के तहत पोस्टमास्टर को लॉन्च करना उसके लिए बेकार है, आप गलत प्रक्रिया से जुड़े रहेंगे।
मुझे लगता है कि आपको शायद PostgreSQL के इंटर्नल पर दस्तावेज़ पढ़ने की आवश्यकता है:
इसे सही कर रहे हैं
यहां आपको क्या करना है - मोटे तौर पर रूपरेखा, क्योंकि मैंने केवल जावा विकास के लिए एक्लिप्स का उपयोग किया है और मेरा सी विकास विम और जीडीबी के साथ करता है:
-
एक डीबग बिल्ड संकलित करें PostgreSQL का (
./configure --enable-debug
. के साथ संकलित) और अधिमानतःCFLAGS="-ggdb -Og -fno-omit-frame-pointer"
) एक--prefix
निर्दिष्ट करें आपके होमडायर में, जैसे--prefix=$HOME/postgres-debug
-
अपने डिबग बिल्ड का
bin
डालें निर्देशिका पहले अपनेPATH
. पर , जैसेexport PATH=$HOME/postgres-debug/bin:$PATH
-
initdb -U postgres -D $HOME/postgres-debug-data
आपके डिबग बिल्ड से PostgreSQL का एक नया उदाहरण -
नया उदाहरण
PGPORT=5599 pg_ctl -D $HOME/postgres-debug-data -l $HOME/postgres-debug-data.log -w start
से शुरू करें -
PGPORT=5599 psql postgres
. से कनेक्ट करें -
आपको जो भी सेटअप करने की ज़रूरत है वह करें
-
SELECT pg_backend_pid()
. के साथ बैकएंड प्रोसेस आईडी पाएं एकpsql
. में सत्र। उस सत्र को खुला छोड़ दो; यह वही है जिसे आप डिबगिंग करेंगे। -
एक्लिप्स प्रोजेक्ट का उपयोग करके उस प्रक्रिया आईडी में एक्लिप्स के डीबगर को संलग्न करें जिसमें पोस्टग्रेएसक्यूएल एक्सटेंशन स्रोत कोड शामिल है जिसे आप डिबगिंग कर रहे हैं। सुनिश्चित करें कि ग्रहण कॉन्फ़िगर किया गया है ताकि यह आपके द्वारा संकलित पोस्टग्रेएसक्यूएल स्रोत कोड भी ढूंढ सके (पता नहीं यह कैसे करें, मैनुअल देखें)।
-
कोई भी वांछित ब्रेकप्वाइंट सेट करें और निष्पादन फिर से शुरू करें
-
psql
. में सत्र, अपने एक्सटेंशन को चलाने और ब्रेकपॉइंट हिट करने के लिए आपको जो कुछ भी करने की आवश्यकता है वह करें -
जब एक्लिप्स में ब्रेकपॉइंट पर निष्पादन रुक जाता है, तो वांछित के रूप में डिबग करें।
बुनियादी गलतफहमियां?
साथ ही, यदि आप वास्तव में हैं उलझन में है कि यह सब कैसे काम करता है:PostgreSQL एक क्लाइंट/सर्वर एप्लिकेशन है। यदि आप किसी क्लाइंट प्रोग्राम . को डीबग करने का प्रयास कर रहे हैं जो libpq या odbc का उपयोग करता है, और कुछ PostgreSQL बैकएंड एक्सटेंशन कोड में ब्रेकपॉइंट को ट्रिगर करने की अपेक्षा करता है, जो होने वाला नहीं है। क्लाइंट एप्लिकेशन एक TCP/IP सॉकेट पर PostgreSQL के साथ संचार करता है। यह एक अलग कार्यक्रम है। gdb
क्लाइंट से कनेक्ट होने पर PostgreSQL सर्वर में ब्रेकप्वाइंट सेट नहीं कर सकते, क्योंकि वे अलग प्रोग्राम हैं। यदि आप सर्वर को डीबग करना चाहते हैं, तो आपको सर्वर से gdb संलग्न करना होगा। PostgreSQL प्रति कनेक्शन एक प्रक्रिया का उपयोग करता है, इसलिए आपको gdb को सही . में संलग्न करना होगा सर्वर प्रक्रिया। यही कारण है कि मैंने SELECT pg_backend_pid()
. का उपयोग करने के लिए कहा ऊपर, और प्रक्रिया आईडी के साथ संलग्न करें।
ऊपर लिंक किए गए आंतरिक दस्तावेज़ देखें, और:
- PostgreSQL साइट - कोडिंग
- PostgreSQL wiki - डेवलपर संसाधन
- डेवलपर अक्सर पूछे जाने वाले प्रश्न
- gdb को linux/bsd/unix पर बैकएंड से जोड़ना