मुझे पता चला कि पायथन चलाने के दौरान सी ++ भाग को कैसे डिबग करना है। (पायथन पुस्तक में प्रक्रिया आईडी पहचान के बारे में पढ़ने के दौरान इसे महसूस किया ..)।
सबसे पहले आप पाइथन प्रोग्राम चलाते हैं जिसमें सी ++ प्रोग्राम शामिल हैं। पायथन प्रोग्राम की शुरुआत में, प्रोग्राम को आपके इनपुट के लिए प्रतीक्षा करने के लिए raw_input() का उपयोग करें। लेकिन इससे पहले कि print os.getpid()
(बेशक आपको ओएस पैकेज आयात करना चाहिए था)। जब आप पाइथन प्रोग्राम चलाते हैं, तो यह आपके द्वारा चलाए जा रहे पायथन प्रोग्राम के पिड को मुद्रित करेगा और आपके कीबोर्ड इनपुट की प्रतीक्षा करेगा।
अजगर रोक कोड:
import os
def w1(str):
print (str)
wait = raw_input()
return
print os.getpid()
w1('starting main..press a key')
परिणाम:।
27352
starting main..press a key
या, आप नीचे के रूप में टिप्पणी (धन्यवाद @AndyG) आयात pdb, pdb.set_trace() का उपयोग करें और संपादित देख सकते हैं * ps -aux
का उपयोग करके पिड प्राप्त करने के लिए।
अब, मान लें कि सी ++ साझा लाइब्रेरी _caffe.so है (जो मेरा मामला है। यह _caffe.so लाइब्रेरी में सभी सी ++ कोड हैं और पाइथन रैपर फ़ंक्शन को बढ़ावा देते हैं)। 27352 पिड है। तब
gdb caffe-fast-rcnn/python/caffe/_caffe.so 27352
की तरह एक और खोल शुरू gdb में या आप DDD तरह का उपयोग कर चित्रमय डिबगिंग उपयोग करना चाहते हैं, कर
ddd caffe-fast-rcnn/python/caffe/_caffe.so 27352
तो फिर तुम gdb शुरू होता देख सकते हैं और शीघ्र साथ इंतजार करेंगे। पाइथन प्रोग्राम जीडीबी द्वारा बाधित है और रुकने वाले मोड में इंतजार कर रहा है (यह आपके मुख्य इनपुट की प्रतीक्षा कर रहा था, लेकिन अब यह वास्तव में स्टेप मोड में है, और इसे मुख्य प्रतीक्षा के साथ आगे बढ़ने के लिए दूसरे डीबगर से जीडीबी जारी रखने की आवश्यकता है)।
अब आप की तरह
br solver.cpp:225
gdb में तोड़ बिंदु आदेश दे सकते हैं और आप संदेश
तरह
Breakpoint 1 at 0x7f2cccf70397: file src/caffe/solver.cpp, line 226. (2 locations)
देख सकते हैं जब आप (कि इस कार्यक्रम के आयोजन किया गया था) दूसरा gdb विंडो में continue
आदेश देते हैं, पायथन कोड फिर से चलाता है। बेशक आपको आगे बढ़ने के लिए पहली जीडीबी विंडो में एक महत्वपूर्ण इनपुट देना चाहिए।
अब कम से कम आप पाइथन प्रोग्राम चलाते समय सी ++ कोड डीबग कर सकते हैं (यही वह है जो मैं करना चाहता था)!
मैंने बाद में जांच की कि क्या मैं एक ही समय में पाइथन और सी ++ डिबगिंग कर सकता हूं और यह काम करता है। आप डीबगर (डीडीडी) जैसे ddd -pydb prog1.py options..
शुरू करते हैं और ऊपर वर्णित विधि का उपयोग करके एक और डीडीडी संलग्न करते हैं। अब आप पाइथन और सी ++ के लिए ब्रेकपॉइंट्स सेट कर सकते हैं और प्रत्येक विंडो में अन्य डीबग फ़ंक्शंस का उपयोग कर सकते हैं (मेरी इच्छा है कि मैं इसे कुछ महीने पहले जानता था .. इसे बहुत मदद मिली चाहिए।)।
संपादित करें: पीआईडी प्राप्त करने के लिए, आप ps -aux | grep python
बजाय कर सकते हैं। यह पिड डीडीडी के पिड के बगल में है।
बिल्कुल कोई जवाब नहीं है, लेकिन आपको कुछ विचार दे सकते हैं: http://www.brendangregg.com/blog/2016-08-09/gdb-example-ncurses.html –