Я хочу напечатать всю длину C-строки в GDB. По умолчанию это сокращенно, как заставить GDB напечатать всю строку?
Я хочу напечатать всю длину C-строки в GDB. По умолчанию это сокращенно, как заставить GDB напечатать всю строку?
Ответы:
set print elements 0
set print elements
number-of-elements
Установите ограничение на количество элементов массива, которые GDB будет печатать. Если GDB печатает большой массив, он прекращает печать после того, как напечатает количество элементов, заданное set print elements
командой. Это ограничение также относится к отображению строк. Когда GDB запускается, этот предел устанавливается равным 200. Установка числа элементов в ноль означает, что печать не ограничена .
Пока ваша программа находится в нормальном состоянии, вы также call (void)puts(your_string)
можете распечатать ее на стандартный вывод. Тот же принцип применим ко всем функциям, доступным отладчику.
Существует третий вариант: команда x, которая позволяет вам установить другое ограничение для конкретной команды вместо изменения глобального параметра. Для печати первых 300 символов строки вы можете использовать x/300s your_string
. Вывод может быть немного сложнее для чтения. Например, печать запроса SQL приводит к:
(gdb) x / 300sb stmt.c_str () 0x9cd948: "ВЫБЕРИТЕ article.r" ... 0x9cd958: "должен из статьи" ... ..
x
!
Команда printf
выведет полные строки:
(gdb) printf "%s\n", string
set print elements nnn
пределу, и не будет печатать всю строку, если вы этого не сделаете set print elements 0
.
Просто чтобы завершить это:
(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}
Это может быть полезно, если вы хотите отладить по их значениям
Использование 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
Предостережения: