std::vector
GDB'deki a içeriğini incelemek istiyorum , nasıl yaparım? Diyelim ki bu std::vector<int>
basitlik uğruna.
std::vector
GDB'deki a içeriğini incelemek istiyorum , nasıl yaparım? Diyelim ki bu std::vector<int>
basitlik uğruna.
Yanıtlar:
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.
$HOME/.gdbinit
gerekli olduğu izlenimini edindim. Şu anda böyle bir dosya yok gdb
ve 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 cgdb
ve 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.
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
Cannot evaluate function -- may be inlined
_M_impl
Derleyicinizin özel adlarını ( vb.) GDB 7.0+ altında bulmak için , şunu kullanınprint /r myVector
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
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'}}