Jak wydrukować pełną wartość długiego łańcucha w gdb?

376

Chcę wydrukować całą długość łańcucha C w GDB. Domyślnie jest on skracany, jak zmusić GDB do wydrukowania całego łańcucha?

John Carter
źródło

Odpowiedzi:

504
set print elements 0

Z instrukcji GDB :

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 elementspolecenie. 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 .
John Carter
źródło
4
W dzisiejszych czasach może być również potrzebny „set print repeats 0”, w przeciwnym razie GDB pominie powtarzające się elementy ciągu / tablicy.
John Lindgren,
dotyczy to również typów tablic
Trevor Boyd Smith
1
Konieczne może być również „ustawienie nieograniczonej wartości maksymalnej”.
rano
100

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.

Duskwuff -inactive-
źródło
2
Ta odpowiedź jest nawet lepsza niż „ustaw elementy wydruku 0” (dla moich celów), ponieważ respektuje znaki powrotu nowego wiersza / karetki zamiast ich ucieczki.
mhenry1384
6
Dobre rozwiązanie, ale nie działa przy próbie analizy pliku zrzutu
pamięci
Genialna sugestia duskwuff, szkoda, że ​​nie przeczytałem tego przed skopiowaniem i wklejeniem go w wywołaniu printf, aby uzyskać nieskalowany wynik ..: D
nevelis
4
Uwaga: ta opcja działa tylko w przypadku debugowania programu na żywo. Podczas debugowania pliku podstawowego nie można użyć polecenia „wywołanie” GDB.
Solomon Slow
1
wymaga też, aby gdb był rozsądny, co coraz częściej NIE wydaje się tak (na moim komputerze z systemem Mac OS X
Michael
39

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” ...
..
Wichert Akkerman
źródło
3
Zastanawiałem się, co znaczy „x / 300sb”. Za pomocą tego ściągawki (pdf) przetłumaczyłem „x / 300sb cstr” jako „eXamine 300 jednostek (bajtów) pamięci pod adresem cstr, interpretowane jako ciąg zakończony znakiem NULL (S).”. Jeśli łańcuch ma długość 100, zobaczysz dużo śmieci, ponieważ drukowane są wszystkie 300 bajtów, bez względu na to, czy mają one sens. Niemniej jednak +1 za przedstawienie mnie x!
Rob W
39

printfPolecenie wydrukowania kompletne ciągi:

(gdb) printf "%s\n", string
korry
źródło
2
przepraszam, ale to nie jest prawda
UmNyobe
11
Wydaje się, że przestrzega set print elements nnnlimitu i nie wydrukuje całego łańcucha, chyba że to zrobisz set print elements 0.
Mark Lakata
3
Gdy próbuję tego, otrzymuję tylko: „Wartości nie można przekonwertować na liczbę całkowitą”.
Philipp Ludwig
2
dla std :: string potrzebujesz string.c_str (), aby uniknąć błędu „Wartość nie może zostać przekonwertowana na liczbę całkowitą”
Paul Childs
21

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

abstraktor
źródło
1

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:

  • Pierwszy jest zależny od biblioteki c ++, ponieważ uzyskuje dostęp do elementów std :: string, ale można go łatwo dostosować.
  • Drugi może być używany tylko w działającym programie, ponieważ wywołuje strlen.
mrtimdog
źródło