2011-06-02 6 views
16

Bir Linux Platformunda C++ kodumu hata ayıklamak için gdb ile Qt Creator kullanıyorum. Ne zaman bir boost::shared_ptr veya benzeri kullanırsam, hata ayıklayıcı, destek uygulamasını içeren üstbilgi dosyalarına adım atar (yani/usr/include /boost/shared_ptr.hpp). Bu dosyaları hata ayıklama açısından göz ardı etmek ve sadece bunlara basmak istiyorum. Bu dosyalardan birine ulaşır ulaşmaz adım atabileceğimi biliyorum, ancak hata ayıklama oturumu başına birkaç kez hata ayıklamak çok daha kolay olurdu. (. Ayıklayıcıyla gdb kullanır): Soru Boost dosyalarının yönelik olduğunu, ancak could QtCreator 2.2 ile OpenSuSE Linux 11.2 üzerinde çalışan ben gcc derleyicisi (g++) kullanıyorumHata ayıklayıcının Boost veya STL üstbilgi dosyalarına adım atmasını engelleyebilir miyim?

,

Düzenleme eklemek için ayrıca STL dosyalarına da uygulanır. Bunun yerine ler yapıyor (aşamasının)

+1

Buna ne dersiniz ?: http://stackoverflow.com/questions/1133365 – 0xC0000022L

+0

@STATUS, teşekkürler. Bu soru, nesne kodu ile dinamik kütüphane kodu arasında bir fark olmadığı sürece en azından otomatik olarak mümkün olmadığından ses çıkarmasını sağlar. – Chance

cevap

0

yapabilirsiniz ilk durdurmak istediğiniz senin fonksiyonunun hattı (b Class :: yöntemle, veya b file.cpp: çizgi) üzerinde
b ardından
c.

gdb bunu

bu işleri istiyorum ama sıkıcı görünebilir b verilen noktada güçlendirme kodu ve mola atlayacaktır. alışkanlık meselesi. tekrarlama ile daha kolay olur.

msvc

3

gdb komut dosyası olan GDB benzer şekilde davranır. değişkenler, kabuk alt komutları, kullanıcı tanımlı işlevler (tanımlar) vb. ise, komut dosyası için python arabirimine sahiptir.

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 

veya STL dolduruyor ve diğer tüm kütüphaneler içinde olmadan çoktan birisi

3

GDB yapılan bu tür komut dosyası olup olmadığını bulmak: işin biraz da

, bu satırlar boyunca gdb komut dosyası yapmak can/usr:

Aşağıdakileri, .gdbinit dosyanıza koyun. Gdb'nin yüklediği veya potansiyel olarak yükleneceği (gdb komutu info sources) kaynakları arar ve mutlak yolu "/ usr" ile başladığında bunları atlar. run komutuna bağlanmıştır, çünkü semboller çalıştırılırken yeniden yüklenebilir.

# 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 

dosyaların listesini kontrol etmek için (örneğin break main) yere bir kesme noktası ayarlamak Atlanacak ve çalıştırma gdb (örneğin run), sonra kesme noktası ulaştıktan sonra info sources ile kontrol edin:

(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>) numaralı telefona bir arama ekleyerek diğer dizinleri atlamak için bunu genişletmek kolaydır.

+0

Bu çözüm gcc ile iyi çalışır, ancak ne yazık ki icc16 ile değil. Bunun için zaten teşekkürler! – shargors

İlgili konular