Как мне распечатать полное значение длинной строки в GDB?
Вопрос
Я хочу напечатать полную длину C-строки в GDB.По умолчанию оно сокращено. Как заставить GDB напечатать всю строку?
Решение
set print elements 0
установить элементы печати
количество элементов
Установите ограничение на количество элементов массива, которые GDB будет печатать. Если GDB печатает большой массив, он прекращает печать после того, как напечатает количество элементов, установленное командой set print elements
. Это ограничение также относится к отображению строк. Когда GDB запускается, этот предел устанавливается равным 200. Установка количества элементов на ноль означает, что печать не ограничена .
Другие советы
Пока ваша программа находится в нормальном состоянии, вы также можете вызывать (void) вводит (your_string)
, чтобы распечатать ее на стандартный вывод. Фактически, тот же принцип применим ко всем функциям, доступным отладчику.
Существует третий вариант: команда x, которая позволяет вам установить другое ограничение для конкретной команды вместо изменения глобального параметра. Для печати первых 300 символов строки вы можете использовать x / 300s your_string
. Вывод может быть немного сложнее для чтения. Например, печать запроса SQL приводит к следующему:
(gdb) x/300sb stmt.c_str() 0x9cd948: "SELECT article.r"... 0x9cd958: "owid FROM articl"... ..
Команда printf
напечатает все строки:
(gdb) printf "%s\n", string
Просто для завершения:
(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}
Это может быть полезно, если вы хотите отлаживать по их значениям
С использованием 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
Предостережения:
- Первый зависит от библиотеки C++, поскольку он обращается к членам std::string, но его легко настроить.
- Второй можно использовать только в работающей программе, поскольку он вызывает strlen.