Як надрукувати повне значення довгого рядка в 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
Можливо, вам також знадобиться "встановити максимальне значення розміру необмеженим".
Ams

100

Поки ваша програма перебуває в нормальному стані, ви також call (void)puts(your_string)можете роздрукувати її до stdout. Цей же принцип діє і для всіх функцій, доступних фактично для налагоджувача.


2
Ця відповідь навіть краща, ніж "встановити елементи друку 0" (для моїх цілей), оскільки вона поважає символи повернення нової лінії / каретки замість того, щоб уникати їх.
mhenry1384

6
Гарне рішення, але не спрацьовує при аналізі основного дамп-файлу
Elalfer

Блискуча пропозиція сутінків, я б хотіла, щоб я прочитала це, перш ніж скопіювати та вставити його у виклик 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, інтерпретується як NULL-завершений рядок (S)." Якщо ваш рядок має довжину 100, то ви побачите багато сміття, оскільки надруковано всі 300 байт, незалежно від того, мають вони сенс чи ні. +1 все-таки за те, що познайомив мене x!
Rob W

39

printfКоманда буде друкувати повні рядки:

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

2
Вибачте, але це неправда
UmNyobe

11
Це, здається, дотримується set print elements nnnліміту, і не надрукує повний рядок, якщо ви цього не зробите set print elements 0.
Марк Лаката

3
Коли я намагаюся це, я отримую лише: "Значення не може бути перетворене на ціле число".
Philipp Ludwig

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}

Це може бути корисно, якщо ви хочете налагодити їх значення


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

Застереження:

  • Перший залежить від li + c lib, оскільки він отримує доступ до членів std :: string, але легко коригується.
  • Другий може бути використаний лише у запущеній програмі, оскільки він називає strlen.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.