




set print elements 0
set print elementsnumber-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.
это также относится и к типам массивов
Вам также может потребоваться «установить неограниченный размер максимального значения».
Пока ваша программа находится в нормальном состоянии, вы также можете call (void)puts(your_string) распечатать ее на стандартный вывод. Фактически, тот же принцип применим ко всем функциям, доступным отладчику.
Этот ответ даже лучше, чем «установить элементы печати 0» (для моих целей), потому что он учитывает символы новой строки / возврата каретки вместо их экранирования.
Хорошее решение, но не работает при попытке проанализировать файл дампа ядра
Блестящее предложение, duskwuff, мне жаль, что я не прочитал это, прежде чем я скопировал и вставил его в вызов printf, чтобы получить неэкранированный вывод ..: D
Это экономит кучу моего времени
Примечание: эта опция работает, только если вы отлаживаете живую программу. Вы не можете использовать команду GDB "call" при отладке основного файла.
также требует, чтобы gdb был вменяемым, что все чаще кажется НЕ так (я получаю сообщение «Нет символа» ставит «в текущем контексте» на моем компьютере Mac OS X)
Я просто пишу "помещает (your_string)" в окно вывода xcode
Также не работает при отладке программы, в которой нет puts(), и проблематично, когда puts() использует UART, а UART вашей цели требует работающего процессора.
Существует третий вариант: команда 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!
Просто чтобы завершить его:
(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
извините, но это неправда
Кажется, что это соответствует пределу set print elements nnn и не будет печатать всю строку, если вы не выполните set print elements 0.
Когда я пробую это, я получаю только: «Значение не может быть преобразовано в целое».
для std :: string вам понадобится string.c_str (), чтобы избежать ошибки «Значение не может быть преобразовано в целое число».
Использование 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
Предостережения:
В настоящее время вам также может потребоваться «установить 0 повторов печати», иначе GDB будет опускать повторяющиеся элементы строки / массива.