Xcode 在释放内存地址时在其上设置断点:lldb

Xcode 在释放内存地址时在其上设置断点:lldb,xcode,free,lldb,Xcode,Free,Lldb,当我的iOS应用程序试图双倍释放内存地址时,内存地址崩溃。我尝试了多种方法试图知道是什么导致了双重自由,例如:监视点或启用僵尸,或者在Xcode中使用工具,但都没有用。有没有什么方法可以在那个内存地址上设置某种断点,这样当它被释放时,它就会命中,我就会知道谁在试图释放它?我还尝试在free方法上设置一个符号断点,但由于连续的免费调用,它会挂起应用程序。您尝试过使用ASAN吗?您可以在项目的运行方案中启用它(它是第一项“地址消毒剂”)。它将强制重新生成,因为它将插入您的代码。但是它在代码中插入的插

当我的iOS应用程序试图双倍释放内存地址时,内存地址崩溃。我尝试了多种方法试图知道是什么导致了双重自由,例如:监视点或启用僵尸,或者在Xcode中使用工具,但都没有用。有没有什么方法可以在那个内存地址上设置某种断点,这样当它被释放时,它就会命中,我就会知道谁在试图释放它?我还尝试在free方法上设置一个符号断点,但由于连续的免费调用,它会挂起应用程序。

您尝试过使用ASAN吗?您可以在项目的运行方案中启用它(它是第一项“地址消毒剂”)。它将强制重新生成,因为它将插入您的代码。但是它在代码中插入的插装将检测双重空闲,在那里停止进程,并向您显示malloc的调用站点&该地址的第一个空闲事件。这是一个非常有用的工具,用于检测此类内存问题。

您需要一个条件断点。在
free
上创建符号断点,然后右键单击它并单击“编辑断点…”

您需要在这里设置一个条件,以便只为您的特定参数调用断点。使用LLDB的
$arg1
变量引用
free
(内存块)的第一个参数,并为其条件设置如下内容:

$arg1 == 0x0000000000001234
但是使用您感兴趣的实际指针值


继续。只有在释放特定指针上的内存块时,才会触发断点。

这是对您问题的字面回答,但Jim的上述回答可能更好地满足您的要求。这个答案也很有用,因为ASAN不适合所有用例,您也不能总是使用它。例如,我有一个Qt应用程序,当使用ASAN构建时,它几乎不会运行。