【问题标题】:Set a breakpoint on memory address when it is being freed: lldb释放内存地址时设置断点:lldb
【发布时间】:2018-03-13 16:11:40
【问题描述】:

我的 iOS 应用程序在尝试双重释放该地址时在内存地址上崩溃。我尝试了多种方法试图了解导致双重释放的原因,例如:观察点或启用 Zombies 或在 Xcode 中使用 Instruments 但无济于事。有什么办法可以在该内存地址上设置某种断点,以便它在被释放时会命中并且我会知道谁在尝试释放它?我还尝试在 free 方法上放置符号断点,但由于连续的 free 调用,它会挂起应用程序。

【问题讨论】:

    标签: xcode free lldb


    【解决方案1】:

    您是否尝试过使用 ASAN?您在项目的 Run Scheme 中打开它(它是第一项“Address Sanitizer”)。它将强制重建,因为它会检测您的代码。但是它在你的代码中插入的工具会检测到双重释放,在那里停止进程,并向你显示 malloc 的调用站点和该地址的第一个空闲事件。这是检测此类内存问题的非常有用的工具。

    【讨论】:

      【解决方案2】:

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

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

      $arg1 == 0x0000000000001234
      

      但使用您感兴趣的实际指针值。

      继续。您的断点只会在该特定指针处的内存块被释放时触发。

      【讨论】:

      • 这是对您问题的字面回答,但吉姆上面的回答可能更好地实现您想要的。
      • 这个答案也很有用,因为 ASAN 并不适合所有用例,而且您不能总是使用它。例如,我有一个 Qt 应用程序,它在使用 ASAN 构建时几乎根本无法运行。
      猜你喜欢
      • 2014-09-28
      • 1970-01-01
      • 2015-08-15
      • 2012-11-10
      • 1970-01-01
      • 2021-05-27
      • 2010-10-29
      • 2014-03-18
      • 1970-01-01
      相关资源
      最近更新 更多