GDB'de bir C ++ vektörünün öğelerini nasıl yazdırabilirim?


Yanıtlar:


79

Vector std :: vector myVector içeriğini görüntülemek için GDB yazmanız yeterlidir:

(gdb) print myVector

Bu aşağıdakine benzer bir çıktı üretir:

$1 = std::vector of length 3, capacity 4 = {10, 20, 30}

Yukarıda elde etmek için, gdb 7 (gdb 7.01 üzerinde test ettim) ve bazı python güzel yazıcıya sahip olmanız gerekir. Bunların kurulum süreci gdb wiki'de açıklanmıştır .

Dahası, yukarıda yükledikten sonra, bu Eclipse C ++ hata ayıklayıcı GUI (ve bence GDB kullanarak herhangi bir IDE) ile iyi çalışır.


16
Vektör elemanları doğrudan yorumlanabilir olduğu sürece bu iyi çalışır. Ancak, vektörün ilgili öğelere işaretçiler içermesi yardımcı olmaz.
wallyk

Açıkçası gdb wiki sayfasını özellikle okunabilir bulmuyorum , belki şimdi "biraz" modası geçmiş olduğundan? Örneğin, önerilen içeriğin $HOME/.gdbinitgerekli olduğu izlenimini edindim. Şu anda böyle bir dosya yok gdbve içeriğini doğru bir şekilde gösteriyor std::vector. Ancak, "takma" girişimlerim sırasında yeni kurduğum ve sonra monte etmediğim cgdbve zaten kurduğum için , libstdc++5şu anda çalışırken güzel baskının neden çalışmadığı hakkında hiçbir fikrim yok.
Enrico Maria De Angelis

257

GCC 4.1.2 ile, myVector adı verilen bir std :: vector <int> tamamını yazdırmak için aşağıdakileri yapın:

print *(myVector._M_impl._M_start)@myVector.size()

Yalnızca ilk N öğeyi yazdırmak için şunları yapın:

print *(myVector._M_impl._M_start)@N

açıklama

Bu büyük olasılıkla derleyici sürümünüze bağlıdır, ancak GCC 4.1.2 için dahili dizinin işaretçisi şöyledir:

myVector._M_impl._M_start 

Ve işaretçi P'den başlayarak bir dizinin N elemanını yazdırmak için GDB komutu şöyledir:

print P@N

Veya kısa bir biçimde (standart bir .gdbinit için):

p P@N

4
Hehe, daha önce beni rahatsız eden bir şey, bu yüzden sadece bu sabah baktım ve kendime bir not olarak ekledim (Jeff'in önerdiği gibi).
John Carter

3
Ayrıca sadece belirli bir vektör öğesi istiyorsanız, myVector._M_impl._M_start + n (n'inci öğe için)
mariner

1
Benim için çalışmıyor. Cannot evaluate function -- may be inlined
wallyk

1
Tek bir eleman, örneğin 2. eleman yazdırmak için: print (myVector._M_impl._M_start) [2]
jfritz42

2
_M_implDerleyicinizin özel adlarını ( vb.) GDB 7.0+ altında bulmak için , şunu kullanınprint /r myVector
Eponymous

14

Hata ayıklama sırasında STL kapsayıcılarını 'izlemek' bir problemdir. İşte geçmişte kullandığım 3 farklı çözüm, hiçbiri mükemmel değil.

1) http://clith.com/gdb_stl_utils/ adresinden GDB komut dosyaları kullanın Bu komut dosyaları hemen hemen tüm STL kaplarının içeriğini yazdırmanıza olanak tanır. Sorun, bu küme kümeleri gibi iç içe kaplar için çalışmıyor olmasıdır.

2) Visual Studio 2005, STL kapsayıcılarını izlemek için harika bir desteğe sahiptir. Bu, iç içe geçmiş kapsayıcılar için çalışır, ancak bu yalnızca STL için uygulanması içindir ve bir Boost kapsayıcısına bir STL kapsayıcısı koyarsanız çalışmaz.

3) Hata ayıklama sırasında yazdırmak istediğiniz belirli öğe için kendi 'yazdırma' işlevinizi (veya yönteminizi) yazın ve öğeyi yazdırmak için GDB'deyken 'çağrı' kullanın. Yazdırma işleviniz g ++ kodunun herhangi bir yerinde çağrılmıyorsa, ölü kod ortadan kaldırılacağını ve 'yazdırma' işlevinin GDB tarafından bulunmayacağını unutmayın (işlevin satır içi olduğunu söyleyen bir mesaj alırsınız). Yani -fkeep-inline-fonksiyonları ile derleyin


11

aşağıdakileri ~ / .gdbinit içine koy

define print_vector
    if $argc == 2
        set $elem = $arg0.size()
        if $arg1 >= $arg0.size()
            printf "Error, %s.size() = %d, printing last element:\n", "$arg0", $arg0.size()
            set $elem = $arg1 -1
        end
        print *($arg0._M_impl._M_start + $elem)@1
    else
        print *($arg0._M_impl._M_start)@$arg0.size()
    end
end

document print_vector
Display vector contents
Usage: print_vector VECTOR_NAME INDEX
VECTOR_NAME is the name of the vector
INDEX is an optional argument specifying the element to display
end

Gdb'yi (veya ~ / .gdbinit kaynağını) yeniden başlattıktan sonra, bununla ilişkili yardımı gösterin

gdb) help print_vector
Display vector contents
Usage: print_vector VECTOR_NAME INDEX
VECTOR_NAME is the name of the vector
INDEX is an optional argument specifying the element to display

Örnek kullanım:

(gdb) print_vector videoconfig_.entries 0
$32 = {{subChannelId = 177 '\261', sourceId = 0 '\000', hasH264PayloadInfo = false, bitrate = 0,     payloadType = 68 'D', maxFs = 0, maxMbps = 0, maxFps = 134, encoder = 0 '\000', temporalLayers = 0 '\000'}}

2
kod için teşekkürler! Yazım hatası var ve "print * ($ arg0._M_impl._M_start + $ elem) @ 1" "print * ($ arg0._M_impl._M_start + $ arg1) @ 1" olmalı? Aşağıdaki değişikliği kullanıyorum: $ argc == 2 if $ arg1> = $ arg0.size () - 1 printf "Error,% s.size () =% d, son öğe yazdırılıyorsa tanımla: \ n", " $ arg0 ", $ arg0.size () - 1 son baskı * ($ arg0._M_impl._M_start + $ arg1) @ 1 başka baskı * ($ arg0._M_impl._M_start) @ $ arg0.size () bitiş sonu
user1541776

el magnifico!
mochas

0

Partiye biraz geç, bu yüzden bir dahaki sefere bu aramayı bana hatırlatma!

Kullanabildim:

p/x *(&vec[2])@4

vecbaşlangıcından itibaren 4 öğeyi (altıgen olarak) yazdırmak için vec[2].

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.