Przypuśćmy, że mamy coś takiego:
#include <map>
int main(){
std::map<int,int> m;
m[1] = 2;
m[2] = 4;
return 0;
}
Chciałbym móc sprawdzić zawartość mapy, na której działa program z gdb.
Jeśli spróbuję użyć operatora indeksu dolnego, otrzymam:
(gdb) p m[1]
Attempt to take address of value not located in memory.
Użycie metody wyszukiwania nie daje lepszych wyników:
(gdb) p m.find(1)
Cannot evaluate function -- may be inlined
Czy istnieje sposób, aby to osiągnąć?
Odpowiedzi:
Myślę, że nie ma, przynajmniej nie, jeśli twoje źródło jest zoptymalizowane itp. Jednak jest kilka makr dla gdb, które mogą sprawdzić dla ciebie kontenery STL:
http://sourceware.org/ml/gdb/2008-02/msg00064.html
Jednak nie używam tego, więc YMMV
źródło
Istniejące odpowiedzi na to pytanie są bardzo nieaktualne. Dzięki najnowszym GCC i GDB to Just Works TM dzięki wbudowanej obsłudze Pythona w GDB 7.x i ładnym drukarkom libstdc ++, które są dostarczane z GCC.
Na przykład OP otrzymuję:
(gdb) print m $1 = std::map with 2 elements = {[1] = 2, [2] = 4}
Jeśli to nie zadziała automatycznie, zobacz pierwszy punkt na stronie pomocy STL na wiki GDB.
Możesz napisać ładne drukarki Python dla własnych typów, zobacz Pretty Printing w podręczniku GDB.
źródło
Could not find operator[]
.Zawsze jest coś oczywistego: zdefiniuj własną funkcję testową ... Wywołaj ją z gdb. Na przykład:
#define SHOW(X) cout << # X " = " << (X) << endl void testPrint( map<int,int> & m, int i ) { SHOW( m[i] ); SHOW( m.find(i)->first ); } int main() { std::map<int,int> m; m[1] = 2; m[2] = 4; return 0; // Line 15. }
I:
.... Breakpoint 1 at 0x400e08: file foo.C, line 15. (gdb) run Starting program: /tmp/z/qD Breakpoint 1, main () at qD.C:15 (gdb) call testPrint( m, 2) m[i] = 4 (*m.find(i)).first = 2 (gdb)
źródło
stl-views.gdb
Kiedyś najlepszą odpowiedź nie było, ale już nie.To nie jest jeszcze zintegrowane z główną linią
GDB
, ale oto, co otrzymujesz, używając gałęzi `` archer-tromey-python '' :(gdb) list 1 #include <map> 2 int main(){ 3 std::map<int,int> m; 4 m[1] = 2; 5 m[2] = 4; 6 return 0; 7 } (gdb) break 6 Breakpoint 1 at 0x8048274: file map.cc, line 6. (gdb) run Breakpoint 1, main () at map.cc:6 6 return 0; (gdb) print m $1 = std::map with 2 elements = { [1] = 2, [2] = 4 } (gdb) quit
źródło
Spróbuj usunąć odniesienia do kontenerów STL: na tej stronie: http://www.yolinux.com/TUTORIALS/GDB-Commands.html
źródło
Powyższe odpowiedzi działają i są w porządku. Jeśli używasz stl-views.gdb, oto właściwy sposób przeglądania map i elementów w nim zawartych. Niech twoja mapa wygląda następująco:
std::map<char, int> myMap;
(gdb) pmap myMap char int
tj.
pmap <variable_name> <left_element_type> <right_element_type>
zobaczyć elementy na mapie.Mam nadzieję, że to pomoże.
źródło
Możesz obejść drugi problem (
Cannot evaluate function -- may be inlined
), upewniając się, że Twój kompilator używa informacji debugowania DWARF-2 (lub 3 lub 4) podczas kompilowania programu. DWARF-2 zawiera wbudowane informacje, więc powinieneś być w stanie użyć dowolnej z opisanych metod, aby uzyskać dostęp do elementówstd::map
kontenera.Aby skompilować z informacjami debugowania DWARF-2, dodaj
-gdwarf-2
flagę do polecenia kompilacji.źródło