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

StackOverflow https://stackoverflow.com/questions/233328

Вопрос

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

Это было полезно?

Решение

set print elements 0

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

установить элементы печати количество элементов
Установите ограничение на количество элементов массива, которые 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.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top