Печатать массив символов в файл в GDB

У меня есть массив символов, содержащий около 100 тыс. записей. Кажется, что когда функция I print *buffer он прерывается преждевременно. есть ли что-нибудь, что я могу сделать, чтобы увеличить количество символов, которые gdb будет печатать на консоли? Если нет, могу ли я напечатать эту переменную в файле? Я пытался использовать команды дампа, но, похоже, не мог придумать правильную вещь.

Ответ 1

(gdb) help x
Examine memory: x/FMT ADDRESS.
ADDRESS is an expression for the memory address to examine.
FMT is a repeat count followed by a format letter and a size letter.
Format letters are o(octal), x(hex), d(decimal), u(unsigned decimal),
  t(binary), f(float), a(address), i(instruction), c(char) and s(string).
Size letters are b(byte), h(halfword), w(word), g(giant, 8 bytes).
The specified number of objects of the specified size are printed
according to the format.

Defaults for format and size letters are those previously used.
Default count is 1.  Default address is following last thing printed
with this command or "print".
(gdb) x/8b array
0xbffd7670:     0       0       0       0       0       0       0       0
(gdb) x/16b array
0xbffd7670:     0       0       0       0       0       0       0       0
0xbffd7678:     0       0       0       0       0       0       0       0
(gdb) x/128b array
0xbffd7670:     0       0       0       0       0       0       0       0
0xbffd7678:     0       0       0       0       0       0       0       0
0xbffd7680:     0       0       0       0       0       0       0       0
0xbffd7688:     0       0       0       0       0       0       0       0
0xbffd7690:     0       0       0       0       0       0       0       0
0xbffd7698:     0       0       0       0       0       0       0       0
0xbffd76a0:     0       0       0       0       0       0       0       0
0xbffd76a8:     0       0       0       0       0       0       0       0
0xbffd76b0:     0       0       0       0       0       0       0       0
0xbffd76b8:     0       0       0       0       0       0       0       0
0xbffd76c0:     0       0       0       0       0       0       0       0
0xbffd76c8:     0       0       0       0       0       0       0       0
0xbffd76d0:     0       0       0       0       0       0       0       0
0xbffd76d8:     0       0       0       0       0       0       0       0
0xbffd76e0:     0       0       0       0       0       0       0       0
0xbffd76e8:     0       0       0       0       0       0       0       0
(gdb)

Если вы хотите, чтобы символы символов ASCII были напечатаны, используйте x/<size>c.

(gdb) set logging file ~/gdb_dump.txt
(gdb) set logging on
Copying output to /home/mminich/gdb_dump.txt.
(gdb) x/26c array
0xbfff4b20:     97 'a'  98 'b'  99 'c'  100 'd' 101 'e' 102 'f' 103 'g' 104 'h'
0xbfff4b28:     105 'i' 106 'j' 107 'k' 108 'l' 109 'm' 110 'n' 111 'o' 112 'p'
0xbfff4b30:     113 'q' 114 'r' 115 's' 116 't' 117 'u' 118 'v' 119 'w' 120 'x'
0xbfff4b38:     121 'y' 122 'z'
(gdb) set logging off
Done logging to /home/mminich/gdb_dump.txt.
(gdb)

Кстати, я полностью согласен с комментарием Уильяма Пурселла по вашему вопросу: "Мне гораздо проще определить функции в коде, который выполняет дамп данных, и просто вызвать их из gdb (оберните определения в #ifdef DEBUG)"

Ответ 2

Я думаю, вам нужно что-то вроде этого:

(gdb) dump binary memory ~/file.bin 0x100390f4c (0x100390f4c + 940)

Команда дампа немного неудобна для использования. Он принимает начальный конечный адрес и выражения, указывающие, что делать с дампом (вы можете использовать value вместо memory для указания выражения, если это работает для вас, но иногда я предпочитаю быть конкретным.) Но (как я уже тестировал выше), вы можете использовать выражения в любом случае, так как я указал конечный адрес выше в отношении начального адреса, который я хотел сбросить, плюс количество байтов, которое я хотел.

Вы также можете сделать что-то вроде этого (передать в выражении, которое приводит к значению указателя, а не по значению самого указателя):

(gdb) dump binary memory ~/file.bin buf (buf + len)

Для получения дополнительной информации см. документацию здесь.

Ответ 3

Для печати неограниченных символов на консоль используйте

set print elements 0

Ответ 4

Я лично использую встроенный Python, например:

pi open("output_data.log","w").write(gdb.execute("print [email protected]",to_string=True))