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

300

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

Теги:
string
debugging
gdb

6 ответов

401
Лучший ответ
set print elements 0

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

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

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

  • 1
    Этот ответ даже лучше, чем «установить элементы печати 0» (для моих целей), потому что он учитывает символы перевода строки / возврата каретки вместо их экранирования.
  • 4
    Хорошее решение, но не работает при попытке проанализировать файл дампа ядра
Показать ещё 6 комментариев
27

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

(gdb) x/300sb stmt.c_str()
0x9cd948:    "SELECT article.r"...
0x9cd958:    "owid FROM articl"...
..
  • 3
    Мне было интересно, что означает "x / 300sb". С помощью этого шпаргалки (pdf) я перевел «x / 300sb cstr» как «eXamine 300 единиц (байтов) памяти по адресу cstr, интерпретируемый как строка (S), оканчивающаяся NULL.». Если ваша строка имеет длину 100, то вы увидите много мусора, потому что напечатаны все 300 байтов, имеют ли они смысл или нет. +1 тем не менее за знакомство с x !
18

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

(gdb) printf "%s\n", string
  • 0
    Спасибо, это сработало в моем случае
  • 1
    извини но это не правда
Показать ещё 2 комментария
15

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

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

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

1

Использование 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.
  • 0
    должны быть set print elements ... не set elements ...
Сообщество Overcoder
Наверх
Меню