Jak wydrukować elementy wektora C++ w GDB?

Chcę sprawdzić zawartość std::vector W GDB, jak to zrobić? Powiedzmy, że to std::vector<int> ze względu na prostotę.

Author: John Carter, 2008-10-31

4 answers

Aby wyświetlić zawartość Vector std:: vector Myvector, wpisz GDB:

(gdb) print myVector

Spowoduje to wyjście podobne do:

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

Aby osiągnąć powyższe, musisz mieć gdb 7 (testowałem go na gdb 7.01) i trochę Pythona pretty-printer. Proces instalacji jest opisany na gdb wiki .

Co więcej, po zainstalowaniu powyżej działa to dobrze z Eclipse C++ debugger GUI (i wszelkie inne IDE używające GDB, jak myślę).

 70
Author: Michał Oniszczuk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-23 13:23:51

W GCC 4.1.2, aby wydrukować całość std:: vector 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 w dużym stopniu zależne od wersji kompilatora, ale dla GCC 4.1.2 wskaźnik do wewnętrznej tablicy to:

myVector._M_impl._M_start 

I polecenie GDB do wypisania N elementów tablicy zaczynających się od wskaźnika P to:

print P@N

Lub w krótkiej formie (dla standardu .gdbinit): {]}

p P@N
 240
Author: John Carter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-03 18:53:17

'obserwowanie' kontenerów STL podczas debugowania jest pewnym problemem. Oto 3 różne rozwiązania, z których korzystałem w przeszłości, żadne z nich nie jest doskonałe.

1) Użyj skryptów GDB z http://clith.com/gdb_stl_utils / skrypty te pozwalają wydrukować zawartość 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 fantastyczne wsparcie dla oglądania kontenerów STL. Działa to dla zagnieżdżonych kontenery ale to jest dla ich implementacji tylko dla STL i nie działa, jeśli umieszczasz kontener STL w kontenerze Boost.

3) Napisz własną funkcję 'print' (lub metodę) dla konkretnego elementu, który chcesz wydrukować podczas debugowania i użyj 'call' w GDB, aby wydrukować element. Zauważ, że jeśli funkcja print nie zostanie wywołana nigdzie w kodzie, g++ usunie martwy kod, a funkcja "print" nie zostanie znaleziona przez GDB (otrzymasz komunikat, że funkcja jest inlined). Więc skompiluj z-fkeep-inline-functions

 14
Author: Nikhil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-04 15:25:01

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'}}
 8
Author: badeip,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-26 06:57:03