2011-12-20 6 views
5

Próbuję użyć ładnych urządzeń drukujących GDB, aby pokazać niestandardową klasę macierzy C++.Ładne drukowanie gdb z bezpośrednimi wywołaniami funkcji

Klasa jest dość standardowa, można ją znaleźć wszędzie. Jest to szablon sparametryzowany przez typ i można uzyskać do niego dostęp za pomocą notacji typu C, np. Mat [i] [j]. Ten pierwszy niejawnie zwraca inną klasę "plasterka" reprezentującą wiersz lub kolumnę, do której ponownie może uzyskać operator [] w celu wyodrębnienia danych. Sama klasa używa zwykłej macierzy C do przechowywania, ale implementuje na niej pewne sztuczki, jak opcja wcześniejszego przydzielenia większej macierzy, włączania niezerowych startów, używania kroku itp. Klasa nie ma natywnego drukowania interfejs i nie mogę go modyfikować ani łączyć z moim własnym kodem.

Własne funkcje powodują, że odtworzenie kodu bezpośredniego dostępu do danych w Pythonie jest bolesne. Ale czy to konieczne? Ogólnie: dlaczego ładne drukowanie powinno odzwierciedlać logikę dostępu do danych? Czy nie mogę po prostu używać wywołań C++ i używać operatorów [] do drukowania elementu i, j-tego? Fakt, że klasa Slice jest tymczasowa w GDB podczas takiego żądania, dodatkowo to komplikuje.

Jestem również dość początkujący w skryptach Pythona i GDB. Próbowałem zhackować przykłady, aby zastąpić dostęp do danych wywołaniami gdb.execute, ale nie mam pojęcia, jak uzyskać dostęp do nazwy obiektu z funkcji to_string, więc mogę użyć czegoś takiego jak gdb.execute (??? + '[] + str (i) + ']', False, True).

Zastanawiam się, jaki jest najskuteczniejszy sposób robienia tego.

Odpowiedz

5

Nie mogę po prostu używać wywołań C++ i używać operatorów [] do drukowania elementu i, j-tego?

Można dzwonić od ładnego-drukarki do dolnego (debugowany) procesu z wykorzystaniem gdb.parse_and_eval (docs), ale ma kilka wad:

  • trzeba proces „na żywo”, aby to zrobić (innymi słowy, dość drukarka nie będzie działać podczas debugowania zrzutu)
  • czy gorszy jest uszkodzony w jakiś sposób wywoływania funkcji w nim będzie prawdopodobnie uszkodzony jeszcze bardziej
  • czy gorszy jest multi- gwintowane i ładna księga ter wywołuje funkcję, która może wymagać blokady (np. malloc), najprawdopodobniej spowodujesz zakleszczenie ślicznej drukarki i nie będzie sposobu na odzyskanie takiej blokady.
+2

Każdy może rzucać razem przykład, proszę? – takbal

1

To nie jest skrypty Pythona, ale proste command sequences dla rozszerzenia GDB. Definiuję nowe polecenie o nazwie print_matrix.

(gdb) define print_matrix 
Type commands for definition of "print_matrix". 
End with a line saying just "end". 
>set $s_arr = $arg0 
>set $i=0 
>while($i < $arg1) 
>p (int [][$arg2]) *($s_arr + $i) 
>set $i = $i + 1 
>end 
>end 
(gdb) print_matrix arr 10 10 
$90 = {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}} 
$91 = {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} 
$92 = {{2, 3, 4, 5, 6, 7, 8, 9, 10, 11}} 
$93 = {{3, 4, 5, 6, 7, 8, 9, 10, 11, 12}} 
$94 = {{4, 5, 6, 7, 8, 9, 10, 11, 12, 13}} 
$95 = {{5, 6, 7, 8, 9, 10, 11, 12, 13, 14}} 
$96 = {{6, 7, 8, 9, 10, 11, 12, 13, 14, 15}} 
$97 = {{7, 8, 9, 10, 11, 12, 13, 14, 15, 16}} 
$98 = {{8, 9, 10, 11, 12, 13, 14, 15, 16, 17}} 
$99 = {{9, 10, 11, 12, 13, 14, 15, 16, 17, 18}} 
(gdb) 

Można również zapisać te polecenia jako skrypt i użyć -x opcja

gdb -x <commands file name> binary.out 
+0

Dzięki, ale muszę skorzystać z ładnego urządzenia do drukowania, ponieważ jego integracja z Eclipse. – takbal