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

376

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

Джон Картер
источник

Ответы:

504
set print elements 0

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

set print elements number-of-elements
Установите ограничение на количество элементов массива, которые GDB будет печатать. Если GDB печатает большой массив, он прекращает печать после того, как напечатает количество элементов, заданное set print elementsкомандой. Это ограничение также относится к отображению строк. Когда GDB запускается, этот предел устанавливается равным 200. Установка числа элементов в ноль означает, что печать не ограничена .
Джон Картер
источник
4
В настоящее время вам также может понадобиться «установить повторение печати 0», иначе GDB пропустит повторяющиеся элементы строки / массива.
Джон Линдгрен
это также относится и к типам массивов
Тревор Бойд Смит
1
Вам также может понадобиться «установить max-value-size unlimited».
Ams
100

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

сумеречный
источник
2
Этот ответ даже лучше, чем «установить элементы печати 0» (для моих целей), потому что он учитывает символы перевода строки / возврата каретки вместо их экранирования.
mhenry1384
6
Хорошее решение, но не работает при попытке проанализировать файл дампа ядра
Elalfer
Блестящее предложение duskwuff, хотелось бы, чтобы я прочитал это до того, как скопировал и вставил его в вызов printf, чтобы получить неэкранированный вывод ..: D
nevelis
4
Примечание: эта опция работает, только если вы отлаживаете живую программу. Вы не можете использовать команду GDB для вызова при отладке файла ядра.
Соломон Медленный
1
также требует, чтобы gdb был в здравом уме, что все чаще кажется НЕУДАЧНЫМ (я получаю «Нет символа» помещает «в текущем контексте» на моем компьютере Mac OS X)
Майкл
39

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

(gdb) x / 300sb stmt.c_str ()
0x9cd948: "ВЫБЕРИТЕ article.r" ...
0x9cd958: "должен из статьи" ...
..
Вихерт Аккерман
источник
3
Мне было интересно, что означает "x / 300sb". С помощью этого шпаргалки (pdf) я перевел «x / 300sb cstr» как «eXamine 300 единиц (байтов) памяти по адресу cstr, интерпретируемый как строка (S) с завершением NULL». Если ваша строка имеет длину 100, то вы увидите много мусора, потому что напечатаны все 300 байтов, независимо от того, имеют ли они смысл или нет. +1 тем не менее за знакомство x!
Роб Вт
39

Команда printfвыведет полные строки:

(gdb) printf "%s\n", string
Корри
источник
2
извините, но это не так
UmNyobe
11
Кажется, что это соответствует set print elements nnnпределу, и не будет печатать всю строку, если вы этого не сделаете set print elements 0.
Марк Лаката
3
Когда я пытаюсь это сделать, я получаю только: «Значение не может быть преобразовано в целое число».
Филипп Людвиг
2
для std :: string вам нужна string.c_str (), чтобы избежать ошибки «Значение не может быть преобразовано в целое число»
Пол Чайлдс
21

Просто чтобы завершить это:

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

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

abstraktor
источник
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

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

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