LLDB评估在iOS上耗尽内存。我怎样才能释放一些记忆?

时间:2014-08-11 18:33:07

标签: ios debugging memory memory-management lldb

在iOS上的LLDB控制台中,我重复了

(lldb) p/x $r1
(unsigned int) $1 = 0x07000006

(lldb) p/x $r1
(unsigned int) $2 = 0x07000006

(lldb) p/x $r1
(unsigned int) $3 = 0x07000006
 ...etc

大约1500次,最后收到以下错误消息

error: Couldn't allocate space for the stack frame: Couldn't malloc: address space is full
Errored out in Execute, couldn't PrepareToExecuteJITExpression

据我了解,每次运行p/x $r1时,调试器都会将$r1计算为表达式,并在内存中为临时变量$N分配缓冲区(其中{ {1}})。在大约1500次评估之后,调试器内存不足,无法再分配缓冲区。

我的问题是如何释放一些记忆?例如。如果我不再需要临时变量N = 1, 2, 3, ...,我可以执行$1之类的操作吗?是否有任何“秘密”lldb命令?

提前感谢您的回答。

1 个答案:

答案 0 :(得分:1)

你在做p/x $r1,因为你需要在临时保留$ r1的值,或者你只是想看到它的价值?如果是后者,您可以使用:

(lldb) register read/x r1

可以缩短为:

(lldb) re r/x r1

直接打印寄存器而不构建临时寄存器。同样,如果您只想查看局部变量的值:

(lldb) frame variable foo

将打印foo的值而不通过完整的表达式解析器。

请注意,当前lldb中还存在一个错误,导致表达式分配的内存超出了他们的需要 - 1500个表达式太少,您甚至在32位系统上都没有内存耗尽。这已在lldb.llvm.org来源中修复,但我不知道该修补程序何时会进入发布版本。

目前还没有办法告诉lldb不要制作或丢弃这些便利变量。没有理由不这样做,只是没有必要这样做。