在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命令?
提前感谢您的回答。
答案 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不要制作或丢弃这些便利变量。没有理由不这样做,只是没有必要这样做。