Chcę wydrukować całą długość łańcucha C w GDB. Domyślnie jest on skracany, jak zmusić GDB do wydrukowania całego łańcucha?
Chcę wydrukować całą długość łańcucha C w GDB. Domyślnie jest on skracany, jak zmusić GDB do wydrukowania całego łańcucha?
Odpowiedzi:
set print elements 0
set print elements
number-of-elements
Ustaw limit liczby elementów drukowanych przez GDB. Jeśli GDB drukuje dużą tablicę, przestaje drukować po wydrukowaniu liczby elementów ustawionych przez set print elements
polecenie. Limit ten dotyczy również wyświetlania ciągów. Po uruchomieniu GDB limit ten wynosi 200. Ustawienie liczby elementów na zero oznacza, że drukowanie jest nieograniczone .
Tak długo, jak twój program jest w rozsądnym stanie, możesz również call (void)puts(your_string)
wydrukować go na standardowe wyjście. Ta sama zasada dotyczy wszystkich funkcji dostępnych dla debuggera.
Istnieje trzecia opcja: polecenie x, która pozwala ustawić inny limit dla konkretnego polecenia zamiast zmiany ustawienia globalnego. Aby wydrukować pierwsze 300 znaków ciągu, możesz użyć x/300s your_string
. Dane wyjściowe mogą być nieco trudniejsze do odczytania. Na przykład wydrukowanie zapytania SQL powoduje:
(gdb) x / 300sb stmt.c_str () 0x9cd948: „WYBIERZ artykuł. R” ... 0x9cd958: „owid FROM articl” ... ..
x
!
printf
Polecenie wydrukowania kompletne ciągi:
(gdb) printf "%s\n", string
set print elements nnn
limitu i nie wydrukuje całego łańcucha, chyba że to zrobisz set print elements 0
.
Aby go ukończyć:
(gdb) p (char[10]) *($ebx)
$87 = "asdfasdfe\n"
Musisz podać długość, ale możesz zmienić reprezentację tego ciągu:
(gdb) p/x (char[10]) *($ebx)
$90 = {0x61,
0x73,
0x64,
0x66,
0x61,
0x73,
0x64,
0x66,
0x65,
0xa}
Może to być przydatne, jeśli chcesz debugować według ich wartości
Używanie set elements ...
nie zawsze jest najlepszym sposobem. Przydałoby się, gdyby były wyraźne set string-elements ...
.
Używam tych funkcji w moim .gdbinit:
define pstr
ptype $arg0._M_dataplus._M_p
printf "[%d] = %s\n", $arg0._M_string_length, $arg0._M_dataplus._M_p
end
define pcstr
ptype $arg0
printf "[%d] = %s\n", strlen($arg0), $arg0
end
Ostrzeżenia: