Я хочу напечатать всю длину C-строки в GDB. По умолчанию он сокращен, как заставить GDB печатать целую строку?
Как напечатать полное значение длинной строки в gdb?
Ответ 1
set print elements 0
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.