Как напечатать полное значение длинной строки в GDB? - PullRequest
347 голосов
/ 24 октября 2008

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

Ответы [ 6 ]

470 голосов
/ 24 октября 2008
set print elements 0

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

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

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

33 голосов
/ 06 октября 2011

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

(gdb) x/300sb stmt.c_str()
0x9cd948:    "SELECT article.r"...
0x9cd958:    "owid FROM articl"...
..
30 голосов
/ 03 декабря 2015

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

(gdb) printf "%s\n", string
17 голосов
/ 18 января 2012

Просто для завершения:

(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 голос
/ 23 июня 2016

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