it-swarm.com.ru

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

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

347
John Carter
set print elements 0

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

set print elements number-of-elements
Установите ограничение на количество элементов массива, которые GDB будет печатать. Если GDB печатает большой массив, он прекращает печать после того, как напечатает количество элементов, заданное командой set print elements. Это ограничение также относится к отображению строк. Когда GDB запускается, этот предел устанавливается на 200. Настройка число-элементов ноль означает, что печать не ограничена,.
471
John Carter

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

95
duskwuff

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

 (gdb) x/300sb stmt.c_str () 
 0x9cd948: "ВЫБРАТЬ article.r" ... 
 0x9cd958: "должен быть из статьи" ... 
 .. 
33
Wichert Akkerman

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

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

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

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

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

17
abstraktor

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