【问题标题】:LLDB evaluations run out of memory on iOS. How can I free some memory?LLDB 评估在 iOS 上内存不足。我怎样才能释放一些内存?
【发布时间】:2014-10-04 16:22:40
【问题描述】:

在 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(其中N = 1, 2, 3, ...)分配一个缓冲区。大约 1500 次评估后,调试器内存不足,无法再分配缓冲区。

我的问题是如何释放一些内存?例如。如果我不再需要临时变量$1,我可以做类似free($1) 的事情吗?是否有任何“秘密” lldb 命令?

提前感谢您的回答。

【问题讨论】:

  • 检查可用的空闲内存,也许你没有。如果是这种情况,终端中的 sudo purge 可能会有所帮助,它会释放一些内存。
  • 我试试,谢谢!可能它会帮助释放一些未使用的内存。但是,我想知道如何释放分配的缓冲区,例如为$1 分配的缓冲区。类似free($1)。有什么想法吗?
  • 不幸的是,我不知道。我试图在这里找到一些东西(lldb.llvm.org/lldb-gdb.html),但没有看到任何相关的东西。
  • @Timur Kuchkarov,是的,我阅读了官方文档并没有找到任何像我需要的那样的 LLDB 命令。无论如何,谢谢你的回答:)

标签: ios debugging memory memory-management lldb


【解决方案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 不创建或丢弃这些便利变量。没有理由不能这样做,只是没有必要。

【讨论】:

  • 感谢您的回答!实际上,我需要在调试会话期间评估许多复杂的表达式,例如$sp+$r0+0x602-0x1000+*(int*)($sp+0x10),有时我会用完约 1500 次评估的限制。此外,在我的 Python 脚本中,我还使用了 EvaluateExpression() lldb API,并且遇到了同样的问题:由于内存限制,脚本不能调用 EvaluateExpression() 大约 1500 次以上。像调用 SBValue::Clean() 这样的技巧对我不起作用 :( 我希望修复程序很快会从 lldb.llvm.org 源到 lldb for iOS。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 2021-12-30
  • 2011-10-27
  • 1970-01-01
  • 2023-01-11
  • 2018-04-15
  • 2013-01-28
相关资源
最近更新 更多