2009-10-26 15 views
10

मैं ग्रहण प्रक्रिया बनाने के लिए subprocess.Popen का उपयोग करने वाले कोड को डीबग करने का एक तरीका खोजने का प्रयास कर रहा हूं: मैं बनने वाली बाल प्रक्रिया को डीबग करने में सक्षम होना चाहता हूं। समस्या यह है कि मुझे प्रक्रिया की सीमाओं में डीबग करने का कोई तरीका नहीं मिल रहा है, और मुझे लगता है कि यह वास्तव में संभव नहीं है। फिर भी, जब तक आप पूछें, तब तक आप कभी नहीं जानते, और इसलिए मैं कर रहा हूं!क्या pydev का उपयोग कर उपप्रोसेस डीबग करने का कोई तरीका है?

पृष्ठभूमि का एक बिट: मेरे पास Waf द्वारा संचालित एक जटिल निर्माण प्रक्रिया है जो आवश्यकतानुसार nose पर कॉल करके हमारे यूनिट परीक्षणों को आमंत्रित करती है: मैं इन प्रक्रियाओं में इकाई परीक्षण विफलताओं को डीबग करने के लिए हुक करना चाहता हूं। मुझे पता है कि मैं सीधे नाक चलाने की कोशिश कर सकता हूं लेकिन समस्या यह है कि पर्यावरण को सही तरीके से लोड करने के लिए हमारे मॉड्यूल के लिए कॉन्फ़िगर करना है, मैं काफी जटिल हूं और मैं कोड को डुप्लिकेट नहीं करना चाहता हूं अगर मैं इससे बच सकूं।

मुझे remote debugging मोड से अवगत है, लेकिन यह बहुत असुविधाजनक है क्योंकि मुझे दूरस्थ प्रक्रिया में मैन्युअल रूप से डीबगर का आह्वान करना है। अगर कोई ऐसा करने का तरीका जानता है जो मैं करने की कोशिश कर रहा हूं तो इसकी बहुत सराहना की जाएगी।

+0

यह प्रश्न और उसके उत्तर काफी पुराने हैं, लेकिन मैं सुझाव देना चाहता हूं कि आप राफेल से वर्तमान में स्वीकृत उत्तर के बजाय पिमलोट से जवाब स्वीकार करें। राफेल का जवाब सही होने पर सही हो सकता है, लेकिन पिमलोट्क का जवाब बिल्कुल सही और बहुत उपयोगी है। – skrrgwasme

उत्तर

4

मुझे लगता है कि पीईडीवी इसे नहीं कर सकता (न ही पीईडीबीजी और विन डीबीजी), लेकिन ऐसा लगता है कि जीडीबी कर सकता है: http://wiki.python.org/moin/DebuggingWithGdb

+0

क्या यह उपप्रोसेसर में कांटा का पालन कर सकता है या क्या आप बस सबप्रोसेस को मैन्युअल रूप से जोड़ने का सुझाव दे रहे हैं? यह जानना दिलचस्प है कि जीडीबी पाइथन स्टैक्स का निरीक्षण कर सकता है: मुझे यह नहीं पता था :) – jkp

+0

मैं बस मैन्युअल रूप से प्रक्रिया को जोड़ने का सुझाव दे रहा हूं। –

+1

वैसे, मैन्युअल रूप से संलग्न करने की सीमा वास्तव में एक परिणाम है कि यूनिक्स सिस्टम कैसे काम करता है, और यह किसी भी विशेष भाषा या डीबगर के लिए विशिष्ट नहीं है। –

3

मुझे कुछ ऐसा काम मिल गया है जो आपके लिए काम कर सकता है।

आप की तरह, मुझे पहले वांछित ब्रेकपॉइंट्स पर pydevd.settrace() पर मैन्युअल रूप से कॉल डालने का रिमोट डीबगिंग विकल्प मिला। लेकिन मैंने यह भी देखा कि बाद के पायडेव ब्रेकपॉइंट्स (यानी बाएं हाशिए में क्लिक करके बनाए गए) का पालन किया गया था। तो ऐसा लगता है कि प्रक्रिया के लिए रिमोट डीबगिंग सत्र स्थापित करने के लिए आपको केवल पहले स्पष्ट सेटट्रैक कॉल की आवश्यकता है, और बाद में सामान्य डीबगर ब्रेकपॉइंट्स का उपयोग करें।

इसके अलावा, आप तो यह वास्तव में प्रक्रिया को स्थगित नहीं करता settrace कॉल संशोधित कर सकते हैं:

import pydevd 
pydevd.settrace(suspend=False) 

तो कहीं उपप्रक्रिया के प्रारंभ में जल्दी ऊपर कोड डालने और आप अच्छा होना चाहिए। अभी भी एक हैक का थोड़ा सा है, लेकिन यह मैन्युअल विधि से निश्चित रूप से बेहतर है।

+1

वहाँ भी settrace subthreads को लागू करने के लिए एक अतिरिक्त ध्वज है, लेकिन यह मेरे लिए मज़बूती से है कि काम करने के लिए नहीं लगता था: pydevd.settrace (निलंबित = झूठी, trace_only_current_thread = false) – pimlottc

+0

PyDev 1.6.4 के रूप में, subthreads काम करता है पता लगाने मेरे लिए ठीक है। Pydev.settrace (...) कॉल मुख्य धागे में रखा गया है। –

संबंधित मुद्दे

 संबंधित मुद्दे