2011-06-02 12 views
16

मैं लिनक्स प्लेटफार्म पर अपने सी ++ कोड को डीबग करने के लिए जीडीबी के साथ क्यूटी निर्माता का उपयोग कर रहा हूं। जब भी मैं boost::shared_ptr या इस तरह का उपयोग करता हूं, तो डीबगर शीर्ष क्रिया फ़ाइलों में कदम उठाता है जिसमें बढ़ावा कार्यान्वयन होता है (यानी/usr//boost/shared_ptr.hpp शामिल)। मैं इन फ़ाइलों को डीबगिंग के मामले में अनदेखा करना चाहता हूं और बस उन पर कदम उठा सकता हूं। मुझे पता है कि जैसे ही यह इन फ़ाइलों में से एक तक पहुंचता है, मैं इसे बाहर निकाल सकता हूं, लेकिन प्रति डिबगिंग सत्र में कई बार ऐसा करने के बिना डीबग करना अधिक आसान होगा। (। जो डिबगर के रूप में gdb उपयोग करता है)क्या मैं डीबगर को बूस्ट या एसटीएल हेडर फाइलों में कदम उठाने से रोक सकता हूं?

मैं जीसीसी संकलक (g++) का उपयोग कर रहा हूँ, QtCreator 2.2 के साथ OpenSuSE लिनक्स 11.2 पर चल

संपादित करें जोड़ने के लिए: प्रश्न बूस्ट फ़ाइलों की ओर तैयार है, लेकिन कर सकते थे एसटीएल फाइलों के लिए भी आवेदन करें।

+1

इस बारे में कैसे ?: http://stackoverflow.com/questions/1133365 – 0xC0000022L

+0

@STATUS, धन्यवाद। यह प्रश्न यह ध्वनि बनाता है जैसे कम से कम स्वचालित रूप से, जब तक ऑब्जेक्ट कोड और गतिशील लाइब्रेरी कोड के बीच कोई अंतर न हो। – Chance

उत्तर

0
कर s (कदम) के बजाय

, आप जहाँ आप बंद करना चाहते हैं अपने समारोह की पहली पंक्ति (ख कक्षा :: विधि, या ख असम्भव: लाइन) पर
ख कर सकते हैं,
तो सी।

gdb बिंदु ख में दी गई है, जहां आप यह

इस काम करता है चाहते हैं, लेकिन कठिन लग सकता है पर बढ़ावा कोड और ब्रेक बायपास करेंगे। यह आदत का विषय है। पुनरावृत्ति के साथ आसान हो जाता है।

MSVC समान व्यवहार करती है GDB को

3

gdb स्क्रिप्ट है। इसमें समय, यदि, चर, खोल उप-आदेश, उपयोगकर्ता परिभाषित फ़ंक्शंस (परिभाषित) इत्यादि हैं। इसमें स्क्रिप्टबिलिटी के लिए पायथन इंटरफ़ेस है।

define step-bypass-boost 
    step 
    while 1 
    use "info source", put current source file into variable 
    if source file does not match */boost/* then 
     break-loop 
    end 
    step 
    end 
end 

या खोजने के एसटीएल में कदम और में अन्य सभी पुस्तकालयों के बिना इस तरह स्क्रिप्ट किसी पहले ही बना दिया है कि क्या

3

GDB:

काम का एक सा के साथ

, तो आप इन पंक्तियों के साथ gdb स्क्रिप्ट बनाने के लिए कर सकते हैं/usr:

अपनी .gdbinit फ़ाइल में निम्न को रखें। यह उन स्रोतों के माध्यम से खोजता है जो जीडीबी लोड हो चुके हैं या संभावित रूप से लोड होंगे (gdb कमांड info sources), और जब उनका पूर्ण पथ "/ usr" से शुरू होता है तो उन्हें छोड़ देता है। यह run कमांड से जुड़ा हुआ है, क्योंकि इसे निष्पादित करते समय प्रतीक पुनः लोड हो सकते हैं।

# skip all STL source files 
define skipstl 
python 
# get all sources loadable by gdb 
def GetSources(): 
    sources = [] 
    for line in gdb.execute('info sources',to_string=True).splitlines(): 
     if line.startswith("/"): 
      sources += [source.strip() for source in line.split(",")] 
    return sources 

# skip files of which the (absolute) path begins with 'dir' 
def SkipDir(dir): 
    sources = GetSources() 
    for source in sources: 
     if source.startswith(dir): 
      gdb.execute('skip file %s' % source, to_string=True) 

# apply only for c++ 
if 'c++' in gdb.execute('show language', to_string=True): 
    SkipDir("/usr") 
end 
end 

define hookpost-run 
    skipstl 
end 

फ़ाइलों की सूची की जांच करने के छोड़ दिया जाए, एक ब्रेकपाइंट कहीं सेट (जैसे, break main) और रन gdb (जैसे, run), तो info sources साथ ब्रेकप्वाइंट पर पहुंच कर जांच:

(gdb) info skip 
Num  Type   Enb What 
1  file   y /usr/include/c++/5/bits/unordered_map.h 
2  file   y /usr/include/c++/5/bits/stl_set.h 
3  file   y /usr/include/c++/5/bits/stl_map.h 
4  file   y /usr/include/c++/5/bits/stl_vector.h 
... 

SkipDir(<some/absolute/path>) पर कॉल जोड़कर अन्य निर्देशिकाओं को छोड़ने के लिए इसे विस्तारित करना आसान है।

+0

यह समाधान gcc के साथ अच्छी तरह से काम करता है लेकिन दुर्भाग्यवश icc16 के साथ नहीं। वैसे भी इसके लिए धन्यवाद! – shargors

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

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