Saya ingin memeriksa konten std::vector
dalam GDB, bagaimana saya melakukannya? Katakanlah itu std::vector<int>
demi kesederhanaan.
Saya ingin memeriksa konten std::vector
dalam GDB, bagaimana saya melakukannya? Katakanlah itu std::vector<int>
demi kesederhanaan.
Jawaban:
Untuk melihat konten vektor std :: vektor myVector, cukup ketik GDB:
(gdb) print myVector
Ini akan menghasilkan output yang mirip dengan:
$1 = std::vector of length 3, capacity 4 = {10, 20, 30}
Untuk mencapai di atas, Anda harus memiliki gdb 7 (saya mengujinya di gdb 7.01) dan beberapa printer cantik python. Proses instalasi ini dijelaskan pada gdb wiki .
Terlebih lagi, setelah menginstal di atas, ini bekerja dengan baik dengan Eclipse C ++ debugger GUI (dan IDE lain yang menggunakan GDB, seperti yang saya kira).
$HOME/.gdbinit
itu diperlukan. Saat ini saya berakhir tanpa file seperti itu sama sekali dan gdb
dengan benar menunjukkan konten std::vector
. Namun, karena selama upaya "bertele-tele" saya baru saja menginstal dan kemudian unistalled cgdb
, dan saya sudah libstdc++5
menginstal, saya tidak tahu mengapa pencetakan cantik tidak bekerja sementara sekarang berfungsi.
Dengan GCC 4.1.2, untuk mencetak seluruh std :: vector <int> yang disebut myVector, lakukan hal berikut:
print *(myVector._M_impl._M_start)@myVector.size()
Untuk hanya mencetak elemen N pertama, lakukan:
print *(myVector._M_impl._M_start)@N
Penjelasan
Ini mungkin sangat tergantung pada versi kompiler Anda, tetapi untuk GCC 4.1.2, pointer ke array internal adalah:
myVector._M_impl._M_start
Dan perintah GDB untuk mencetak elemen N array mulai dari pointer P adalah:
print P@N
Atau, dalam bentuk singkat (untuk .gdbinit standar):
p P@N
Cannot evaluate function -- may be inlined
_M_impl
dll) untuk kompiler Anda di bawah GDB 7.0+, gunakanprint /r myVector
STL 'Menonton' kontainer saat debugging agak menjadi masalah. Berikut adalah 3 solusi berbeda yang pernah saya gunakan di masa lalu, tidak ada satupun yang sempurna.
1) Gunakan skrip GDB dari http://clith.com/gdb_stl_utils/ Skrip ini memungkinkan Anda untuk mencetak konten hampir semua wadah STL. Masalahnya adalah ini tidak berfungsi untuk kontainer bersarang seperti set tumpukan.
2) Visual Studio 2005 memiliki dukungan fantastis untuk menonton wadah STL. Ini berfungsi untuk wadah bersarang tetapi ini hanya untuk penerapan STL dan tidak berfungsi jika Anda meletakkan wadah STL dalam wadah Peningkatan.
3) Tulis fungsi 'print' Anda sendiri (atau metode) untuk item spesifik yang ingin Anda cetak saat debugging dan gunakan 'panggilan' saat di GDB untuk mencetak item. Perhatikan bahwa jika fungsi cetak Anda tidak dipanggil di mana pun dalam kode g ++ akan melakukan penghapusan kode mati dan fungsi 'cetak' tidak akan ditemukan oleh GDB (Anda akan mendapatkan pesan yang mengatakan bahwa fungsi tersebut sebaris). Jadi kompilasi dengan -fkeep-inline-functions
tuliskan berikut ini di ~ / .gdbinit
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
Setelah memulai ulang gdb (atau sumber ~ / .gdbinit), perlihatkan bantuan terkait seperti ini
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
Contoh penggunaan:
(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'}}