13

我有一个包含大约 100k 个条目的字符数组。似乎在我的功能中 print *buffer它被过早地切断了。我能做些什么来延长 gdb 将打印到控制台的字符数量吗?如果没有,我可以将此变量打印到文件中吗?我尝试使用转储命令,但似乎想不出正确的方法。

4

4 回答 4

27

我想你想要这样的东西:

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

转储命令使用起来有点尴尬。它需要一个开始和结束地址,以及指示转储内容的表达式(您可以使用value而不是memory指定表达式,如果这对您有用,但有时我宁愿具体。)但它似乎(正如我'已经在上面测试过)无论如何你都可以使用表达式,因为我已经根据我想要转储的起始地址以及我想要的字节数指定了上面的结束地址。

您还可以执行以下操作(传入导致指针值而不是指针本身值的表达式):

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

有关详细信息,请参阅此处的文档

于 2013-09-13T06:45:30.857 回答
13
(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)

顺便说一句,我完全同意 William Pursell 在您的问题下的评论:“我发现在执行数据转储的代码中定义函数要容易得多,只需从 gdb 调用它们。(将定义包装在 #ifdef DEBUG 中)”

于 2013-01-30T17:13:54.743 回答
3

要将无限字符打印到控制台,请使用

set print elements 0
于 2014-06-25T05:53:57.137 回答
3

我个人使用嵌入式 python 来转储数据。例如:

(gdb) pi open("output_data.log","w").write(gdb.execute("print myarray@100000",to_string=True))
于 2019-01-18T15:52:50.213 回答