Jak wydrukować pełną wartość długiego ciągu w gdb?

Chcę wydrukować pełną długość ciągu C w GDB. Domyślnie jest skracany, jak wymusić na GDB wydrukowanie całego ciągu?

Author: John Carter, 2008-10-24

6 answers

set print elements 0

Z podręcznika GDB :

set print elements number-of-elements
Ustawia limit liczby elementów tablicy, które będą drukowane przez GDB. Jeśli GDB drukuje dużą tablicę, przestaje drukować po wydrukowaniu liczby elementów ustawionej przez polecenie set print elements. Ograniczenie to dotyczy również wyświetlania ciągów znaków. Po uruchomieniu GDB limit ten jest ustawiony na 200. ustawienie liczby elementów na zero oznacza, że drukowanie jest nieograniczone.
 437
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-04-29 21:58:38

Tak długo, jak Twój program jest w stanie zdrowym, możesz również call (void)puts(your_string) wydrukować go na stdout. Ta sama zasada dotyczy wszystkich funkcji dostępnych dla debuggera.

 90
Author: duskwuff,
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
2008-10-31 10:42:56

Istnieje trzecia opcja: polecenie x, które pozwala ustawić inny limit dla konkretnego polecenia zamiast zmieniać ustawienia globalne. Aby wydrukować pierwsze 300 znaków ciągu można użyć x/300s your_string. Wynik może być nieco trudniejszy do odczytania. Na przykład wydrukowanie zapytania SQL powoduje:

(gdb) x/300sb stmt.c_str()
0x9cd948:    "SELECT article.r"...
0x9cd958:    "owid FROM articl"...
..
 30
Author: Wichert Akkerman,
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-10-06 16:15:39

Polecenie printf wyświetli pełne ciągi znaków:

(gdb) printf "%s\n", string
 22
Author: korry,
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
2018-04-20 09:17:32

Tylko do uzupełnienia:

(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}

To może być przydatne, jeśli chcesz debugować według ich wartości

 16
Author: abstraktor,
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
2012-01-18 11:05:52

Używanie {[1] }nie zawsze jest najlepszym sposobem. Przydałoby się, gdyby istniały odrębne set string-elements ....

Więc 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

Zastrzeżenia:

  • pierwszy jest zależny od C++ lib, ponieważ uzyskuje dostęp do elementów std::string, ale można go łatwo dostosować.
  • drugi może być używany tylko w uruchomionym programie, ponieważ wywołuje strlen.
 1
Author: mrtimdog,
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
2016-06-23 07:08:33