【发布时间】:2018-03-13 16:11:40
【问题描述】:
我的 iOS 应用程序在尝试双重释放该地址时在内存地址上崩溃。我尝试了多种方法试图了解导致双重释放的原因,例如:观察点或启用 Zombies 或在 Xcode 中使用 Instruments 但无济于事。有什么办法可以在该内存地址上设置某种断点,以便它在被释放时会命中并且我会知道谁在尝试释放它?我还尝试在 free 方法上放置符号断点,但由于连续的 free 调用,它会挂起应用程序。
【问题讨论】:
我的 iOS 应用程序在尝试双重释放该地址时在内存地址上崩溃。我尝试了多种方法试图了解导致双重释放的原因,例如:观察点或启用 Zombies 或在 Xcode 中使用 Instruments 但无济于事。有什么办法可以在该内存地址上设置某种断点,以便它在被释放时会命中并且我会知道谁在尝试释放它?我还尝试在 free 方法上放置符号断点,但由于连续的 free 调用,它会挂起应用程序。
【问题讨论】:
您是否尝试过使用 ASAN?您在项目的 Run Scheme 中打开它(它是第一项“Address Sanitizer”)。它将强制重建,因为它会检测您的代码。但是它在你的代码中插入的工具会检测到双重释放,在那里停止进程,并向你显示 malloc 的调用站点和该地址的第一个空闲事件。这是检测此类内存问题的非常有用的工具。
【讨论】:
您需要一个条件断点。在free 上创建符号断点,然后右键单击它并单击“编辑断点...”。
您需要在此处设置一个条件,以便仅针对您的特定参数调用断点。使用 LLDB 的 $arg1 变量来引用 free 的第一个参数(您的内存块)并为其条件设置如下内容:
$arg1 == 0x0000000000001234
但使用您感兴趣的实际指针值。
继续。您的断点只会在该特定指针处的内存块被释放时触发。
【讨论】: