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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
402
0
210 486
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий
set print elements 0

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

set print elements number-of-elements
Set a limit on how many elements of an array GDB will print. If GDB is printing a large array, it stops printing after it has printed the number of elements set by the set print elements command. This limit also applies to the display of strings. When GDB starts, this limit is set to 200. Setting number-of-elements to zero means that the printing is unlimited.

В настоящее время вам также может потребоваться «установить 0 повторов печати», иначе GDB будет опускать повторяющиеся элементы строки / массива.

John Lindgren 23.02.2018 20:45

это также относится и к типам массивов

Trevor Boyd Smith 11.05.2018 22:48

Вам также может потребоваться «установить неограниченный размер максимального значения».

Aaron Swan 30.10.2018 23:22

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

Этот ответ даже лучше, чем «установить элементы печати 0» (для моих целей), потому что он учитывает символы новой строки / возврата каретки вместо их экранирования.

mhenry1384 22.06.2010 20:34

Хорошее решение, но не работает при попытке проанализировать файл дампа ядра

Elalfer 01.02.2011 02:47

Блестящее предложение, duskwuff, мне жаль, что я не прочитал это, прежде чем я скопировал и вставил его в вызов printf, чтобы получить неэкранированный вывод ..: D

nevelis 04.10.2011 03:37

Это экономит кучу моего времени

Allamaprabhu 12.11.2013 15:18

Примечание: эта опция работает, только если вы отлаживаете живую программу. Вы не можете использовать команду GDB "call" при отладке основного файла.

Solomon Slow 14.02.2015 01:33

также требует, чтобы gdb был вменяемым, что все чаще кажется НЕ так (я получаю сообщение «Нет символа» ставит «в текущем контексте» на моем компьютере Mac OS X)

Michael 05.05.2015 05:14

Я просто пишу "помещает (your_string)" в окно вывода xcode

Regis St-Gelais 28.06.2016 20:32

Также не работает при отладке программы, в которой нет puts(), и проблематично, когда puts() использует UART, а UART вашей цели требует работающего процессора.

12431234123412341234123 06.11.2018 20:11

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

(gdb) x/300sb stmt.c_str()
0x9cd948:    "SELECT article.r"...
0x9cd958:    "owid FROM articl"...
..

Интересно, что значит "х / 300сб". С помощью этого шпаргалка (pdf) я перевел «x / 300sb cstr» как «eXamine 300 единиц (байтов) памяти по адресу cstr, интерпретируемое как строка с завершающим NULL (S).». Если ваша строка имеет длину 100, вы увидите много мусора, потому что печатаются все 300 байтов, независимо от того, имеют ли они смысл или нет. +1 тем не менее за то, что познакомил меня с x!

Rob W 03.02.2014 20:34

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

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

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

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

(gdb) printf "%s\n", string

извините, но это неправда

UmNyobe 29.05.2017 12:32

Кажется, что это соответствует пределу set print elements nnn и не будет печатать всю строку, если вы не выполните set print elements 0.

Mark Lakata 13.10.2017 21:17

Когда я пробую это, я получаю только: «Значение не может быть преобразовано в целое».

Philipp Ludwig 28.01.2019 15:57

для std :: string вам понадобится string.c_str (), чтобы избежать ошибки «Значение не может быть преобразовано в целое число».

Paul Childs 24.10.2019 07:53

Использование 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.

Другие вопросы по теме