2016-08-11 7 views
16

मैं ddd -pydb prog.py का उपयोग कर पाइथन कोड डीबग कर सकता हूं। prog.py के बाद भी सभी पायथन कमांड लाइन तर्क पारित किए जा सकते हैं। मेरे मामले में, सी ++ में कई कक्षाएं लागू की गई हैं जो boost-python का उपयोग करके अजगर के संपर्क में आती हैं। काश मैं पाइथन कोड और सी ++ एक साथ डीबग कर सकता हूं। उदाहरण के लिए मैं इस तरह ब्रेक अंक सेट करना चाहते हैं:पाइथन और सी ++ को एक साथ बढ़ावा देने से उजागर

break my_python.py:123 
break my_cpp.cpp:456 
cont 
बेशक

मैं डिबग विकल्प के साथ संकलन C++ कोड के बाद यह कोशिश कर रहा हूँ लेकिन डिबगर नहीं पार बढ़ावा सीमा। क्या कोई रास्ता है?

EDIT: मैंने http://www.boost.org/doc/libs/1_61_0/libs/python/doc/html/faq/how_do_i_debug_my_python_extensi.html देखा। मैंने इसका अनुसरण किया और मैं पाइथन और सी ++ दोनों के लिए डीबगिंग कर सकता हूं। लेकिन मैं अधिमानतः DDD के साथ दृश्य डिबगिंग करना चाहता हूं लेकिन मुझे नहीं पता कि DDD के अंदर 'target exec python' कमांड कैसे देना है। यदि नहीं (लिंक के रूप में बस gdb का उपयोग करके) मुझे एक पायथन स्क्रिप्ट के लिए डीबग करने में सक्षम होना चाहिए जो कि लिंक में पाइथन कमांड को इंटरैक्टिव रूप से नहीं दे रहा है।

+0

बिल्कुल कोई जवाब नहीं है, लेकिन आपको कुछ विचार दे सकते हैं: http://www.brendangregg.com/blog/2016-08-09/gdb-example-ncurses.html –

उत्तर

7

मुझे पता चला कि पायथन चलाने के दौरान सी ++ भाग को कैसे डिबग करना है। (पायथन पुस्तक में प्रक्रिया आईडी पहचान के बारे में पढ़ने के दौरान इसे महसूस किया ..)।
सबसे पहले आप पाइथन प्रोग्राम चलाते हैं जिसमें सी ++ प्रोग्राम शामिल हैं। पायथन प्रोग्राम की शुरुआत में, प्रोग्राम को आपके इनपुट के लिए प्रतीक्षा करने के लिए 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.. शुरू करते हैं और ऊपर वर्णित विधि का उपयोग करके एक और डीडीडी संलग्न करते हैं। अब आप पाइथन और सी ++ के लिए ब्रेकपॉइंट्स सेट कर सकते हैं और प्रत्येक विंडो में अन्य डीबग फ़ंक्शंस का उपयोग कर सकते हैं (मेरी इच्छा है कि मैं इसे कुछ महीने पहले जानता था .. इसे बहुत मदद मिली चाहिए।)।

enter image description here

संपादित करें: पीआईडी ​​प्राप्त करने के लिए, आप ps -aux | grep python बजाय कर सकते हैं। यह पिड डीडीडी के पिड के बगल में है।

+0

pdb.set_trace() शायद बेहतर है पाइथन को रोकने के लिए रास्ता, लेकिन आखिरकार उनका एक ही प्रभाव है। – AndyG

+0

@ एंडीजी आह, यह भी काम करता है। धन्यवाद। –

2

मुझे एक ही समस्या थी, लेकिन काम करने के लिए Chan's answer में समाधान प्राप्त करने में विफल रहा (मैक ओएस एक्स 10.12.4 पर)। इसके बजाय निम्नलिखित मेरे लिए काम किया।

  1. एक पायथन स्क्रिप्ट test.py लिखें जो बढ़ावा देता है और बढ़ावा देता है। पायथन मॉड्यूल। डिबगर

    lldb python3 test.py 
    

    > lldb python3 test.py 
    (lldb) target create "python3" 
    Current executable set to 'python3' (x86_64). 
    (lldb) settings set -- target.run-args "test.py" 
    (lldb) run 
    Process 46189 launched: '/Users/me/anaconda/bin/python3' (x86_64) 
    test.cpython-36m-darwin.so was compiled with optimization - stepping may behave oddly; variables may not be available. 
    Process 46189 stopped 
    * thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x10d4b3000) 
    frame #0: 0x00000001019f49c2 test.cpython-36m-darwin.so`std::__1::enable_if<true, void>::type (anonymous namespace)::Render2D<double>::add_particle<true, 5ul>(float*, float, float, float, float) const [inlined] mylib::SSE::packed<8ul, float>::loadu(
        944  { return {_mm256_load_ps(p)}; } 
        945  /// load from unaligned memory location 
        946  static __always__inline packed loadu(const element_type*p) noexcept 
    -> 947  { return {_mm256_loadu_ps(p)}; } 
        948  /// load from aligned memory location, using template arg for alignment 
        949  template<bool aligned> 
    
        950  static __always_inline enable_if_t< aligned, packed> 
    

देने पीआईडी ​​प्राप्त करने और एक अलग विंडो या किसी breakpoints सेट से डिबगर शुरू करने के लिए कोई ज़रूरत नहीं में

  • शुरू अजगर।

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