Chcę sprawdzić zawartość std::vector
GDB, jak to zrobić? Powiedzmy, że to std::vector<int>
dla uproszczenia.
Chcę sprawdzić zawartość std::vector
GDB, jak to zrobić? Powiedzmy, że to std::vector<int>
dla uproszczenia.
Odpowiedzi:
Aby wyświetlić zawartość wektor std :: vector myVector, po prostu wpisz GDB:
(gdb) print myVector
To da wynik podobny do:
$1 = std::vector of length 3, capacity 4 = {10, 20, 30}
Aby osiągnąć powyższe, musisz mieć gdb 7 (przetestowałem go na gdb 7.01) i trochę ładnej drukarki w Pythonie. Proces ich instalacji opisano na gdb wiki .
Co więcej, po instalacji powyżej działa to dobrze z graficznym interfejsem debugera Eclipse C ++ (i każdym innym IDE używającym GDB, jak myślę).
$HOME/.gdbinit
była konieczna. W tej chwili nie mam w ogóle takiego pliku i gdb
poprawnie pokazuję zawartość std::vector
. Ponieważ jednak podczas moich prób „włóczenia się” właśnie zainstalowałem, a następnie zainstalowałem cgdb
, a już libstdc++5
zainstalowałem, nie mam pojęcia, dlaczego ładny druk nie działał, a teraz działa.
W GCC 4.1.2, aby wydrukować cały plik std :: vector <int> o nazwie myVector, wykonaj następujące czynności:
print *(myVector._M_impl._M_start)@myVector.size()
Aby wydrukować tylko pierwsze N elementów, wykonaj:
print *(myVector._M_impl._M_start)@N
Wyjaśnienie
Jest to prawdopodobnie silnie zależne od wersji kompilatora, ale w przypadku GCC 4.1.2 wskaźnik do tablicy wewnętrznej to:
myVector._M_impl._M_start
A polecenie GDB do wydrukowania N elementów tablicy zaczynających się od wskaźnika P to:
print P@N
Lub, w krótkiej formie (dla standardowego .gdbinit):
p P@N
Cannot evaluate function -- may be inlined
_M_impl
itp.) Kompilatora w GDB 7.0+, użyjprint /r myVector
„Obserwowanie” kontenerów STL podczas debugowania stanowi pewien problem. Oto 3 różne rozwiązania, z których korzystałem w przeszłości, żadne z nich nie jest idealne.
1) Użyj skryptów GDB ze strony http://clith.com/gdb_stl_utils/. Skrypty te umożliwiają drukowanie zawartości prawie wszystkich kontenerów STL. Problem polega na tym, że nie działa to w przypadku zagnieżdżonych kontenerów, takich jak stos zestawów.
2) Visual Studio 2005 ma fantastyczną obsługę oglądania kontenerów STL. Działa to w przypadku zagnieżdżonych kontenerów, ale służy to ich implementacji tylko dla STL i nie działa, jeśli umieszczasz kontener STL w kontenerze Boost.
3) Napisz własną funkcję (lub metodę) „drukowania” dla określonego elementu, który chcesz wydrukować podczas debugowania, i użyj „wywołania” w GDB, aby wydrukować element. Zauważ, że jeśli twoja funkcja drukowania nie jest wywoływana nigdzie w kodzie, g ++ dokona eliminacji martwego kodu, a GDB nie znajdzie funkcji „drukowania” (pojawi się komunikat, że funkcja jest wstawiona). Więc skompiluj z funkcjami -fkeep-inline
umieść następujące w ~ / .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
Po ponownym uruchomieniu gdb (lub sourcing ~ / .gdbinit), pokaż powiązaną pomoc w ten sposób
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
Przykładowe użycie:
(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'}}