Как напечатать полное значение длинной строки в gdb?

Я хочу напечатать всю длину C-строки в GDB. По умолчанию он сокращен, как заставить GDB печатать целую строку?

Ответ 1

set print elements 0

Из руководства GDB:

set print elements <я > number-of-elements
Установите ограничение на количество элементов массива GDB. Если GDB печатает большой массив, он прекращает печать после того, как он напечатал количество элементов, заданных командой set print elements. Это ограничение также относится к отображению строк. Когда GDB запускается, этот предел установлен на 200. Установка число элементов на ноль означает, что печать неограничена.

Ответ 2

Пока ваша программа в нормальном состоянии, вы также можете call (void)puts(your_string) распечатать ее на stdout. Тот же принцип применяется ко всем функциям, доступным для отладчика.

Ответ 3

Существует третий вариант: команда x, которая позволяет вам установить другой предел для конкретной команды вместо изменения глобальной настройки. Чтобы напечатать первые 300 символов строки, вы можете использовать x/300s your_string. Результат может быть немного труднее прочитать. Например, печать SQL-запроса приводит к:

(gdb) x/300sb stmt.c_str()
0x9cd948:    "SELECT article.r"...
0x9cd958:    "owid FROM articl"...
..

Ответ 4

Команда printf будет печатать полные строки:

(gdb) printf "%s\n", string

Ответ 5

Просто для завершения:

(gdb) p (char[10]) *($ebx)
$87 =   "asdfasdfe\n"

Вы должны указать длину, но можете изменить представление этой строки:

(gdb) p/x (char[10]) *($ebx)
$90 =   {0x61,
  0x73,
  0x64,
  0x66,
  0x61,
  0x73,
  0x64,
  0x66,
  0x65,
  0xa}

Это может быть полезно, если вы хотите отлаживать свои значения

Ответ 6

Использование set elements ... не всегда является лучшим способом. Было бы полезно, если бы был отличный set string-elements ....

Итак, я использую эти функции в своем .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

Предостережения:

  • Первый из них - это С++ lib, поскольку он обращается к членам std::string, но легко настраивается.
  • Второй может использоваться только в запущенной программе, поскольку он вызывает strlen.