当泄漏工具未显示内存泄漏时,如何调试内存泄漏?

2023-12-11

我有一个用 Swift 编写的 iOS 应用程序,该应用程序正在泄漏内存 - 在某些情况下,一些对象应该被释放,但它们没有。我通过简单地添加了解了这个问题deinit调试消息如下:

deinit {
    println("DEINIT: KeysProvider released")
}

因此,在此类导致对象释放的事件发生后,控制台中应该出现 deinit 消息。但是,对于某些应该释放的对象,该消息丢失了。尽管如此,Leaks Developer Tool 并未显示任何泄漏。我该如何解决这种情况?


In Xcode 8, you can click on the "Debug Memory Graph" button, debugmemorygraphbutton in the debug toolbar (shown at the bottom of the screen):

debug memory graph

参见苹果的诊断和解决正在运行的应用程序中的错误:可视化和诊断不断增加的内存使用情况.

只需识别左侧面板中您认为应该已释放的对象,它就会向您显示对象图(如上面的主画布所示)。这对于快速识别在相关对象上建立强引用的位置非常有用。从这里开始,您可以开始您的研究,诊断为什么这些强引用没有被解析(例如,如果有问题的对象具有来自其他应该被释放的对象的强引用,也可以查看该对象的图表,您可能会发现问题(例如强引用循环、重复计时器等)。

请注意,在右侧面板中,我看到了调用树。我通过在方案设置中打开“malloc stack”日志记录选项得到了这一点:

malloc stack

无论如何,完成此操作后,可以单击上面第一个屏幕快照右侧面板中堆栈跟踪中显示的相关方法调用旁边的箭头,您可以看到该强引用最初是在哪里建立的:

code


传统的 Instruments 技术(如果使用旧版本的 Xcode 特别有用)在我原来的答案中描述如下。


我建议使用 Instruments 的“分配”工具和“记录引用计数”功能:

record reference counts

然后,您可以在 Instruments 中运行该应用程序,然后搜索您知道存在泄漏的类,并通过单击箭头进行钻取:

enter image description here

然后,您可以使用右侧的“扩展详细信息”面板深入了解详细信息并查看堆栈跟踪:

extended details

在“扩展详细信息”面板中,重点关注黑色代码,而不是灰色系统调用。无论如何,从“扩展详细信息”面板中,您可以直接在 Instruments:: 中深入了解源代码:

your code

有关使用 Instruments 追踪内存问题的更多信息和演示,请参阅:

  • WWDC 2021 视频检测并诊断内存问题
  • 2019 年全球开发者大会视频仪器入门
  • 2018 年全球开发者大会视频iOS 内存深度探究
  • 2013 年全球开发者大会视频修复内存问题
  • 2012 年全球开发者大会视频iOS 应用性能:内存
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当泄漏工具未显示内存泄漏时,如何调试内存泄漏? 的相关文章

随机推荐

  • 使用 C++ 中的 NDK 更新 Android UI

    我的问题与这篇文章直接相关 https groups google com forum topic android ndk 291sBdkITyI 基本上 我有一个用 C 编写的应用程序 使用 NDK 编译 具有基本的 Android 活动
  • 在外部网站上使用 Inappbrowser 自动登录?

    我已经使用 Phonegap Build 构建了一个本机应用程序 有没有办法在外部网站的 webview 中自动登录 嵌入 inappbrowser 应用程序启动 然后用户将重定向到网站进行登录 但用户必须一次又一次地输入用户名和密码 是否
  • 将值写入用户窗体中的文本框 - VBA

    我正在尝试在放置在用户窗体上的文本框中动态写入一个值 这是我的代码 我在最后一行收到错误 它说需要对象 Sub Userform1 Display TotalSelected 0 With Sheets Main Ent ListBox F
  • 为什么 jQuery ajax 调用仅在我在 Chrome 中调试时才有效?

    我有一个来自表单提交的简单 ajax 调用 它在我调试时有效 即弹出警报 但在运行时它不起作用 这对我来说似乎有点神秘 function signUpForm submit function var request ajax url php
  • 根据谷歌电子表格中的单元格颜色更改单元格值

    我一直在寻找一种根据另一种单元格颜色更改单元格值的方法 例如 如果单元格颜色为红色 则为 文本 有没有办法做到这一点 我知道有一种方法可以根据单元格值更改单元格颜色 但我想要相反的方法 有人知道吗 无论是脚本还是公式 谷歌应用程序脚本中有类
  • 气流可以在不重新启动调度程序的情况下加载 dags 文件吗

    就我而言 我在 dags 路径下编写了一个 dag 文件 启动airflow调度程序后 成功加载dag文件 但是 更改 dag 文件后 无法加载 dag 文件 有没有建议加载 dag 文件而不重新启动调度程序 您的 DAG 应根据调度程序心
  • 无法查看从 Subversion 存储库中删除的文件的内容

    不久前我从 Subversion 存储库中删除了一个文件 现在我想看看它的内容 我确定该文件在修订版 68 中已被删除 因此我尝试了以下操作 svn cat r 67 path to file 从项目根目录 svn 告诉我svn E1550
  • MySqli:可以创建数据库吗? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我一直在筛选 MySQLi 文档 据我所知 我无法使用 PHP 和 MySQLi 创建数
  • 在 Webkit .NET 中打开本地文件

    由于某种原因 简单的 WebKitBrowser1 Navigate localfilehere 不起作用 我尝试将 file 添加到 URL 但这也不起作用 这看起来很荒谬 但是这个功能真的不存在吗 看来您输入了错误的网址 你可以通过以下
  • 嵌套相对定位的div需要有100%的高度

    我试图在这里获取嵌套的 div canvas 白色区域 http osf Fivetoolsoftware com填满 100 的空白空间 这是 HTML
  • 在服务器中创建文件后使用 jQuery 下载文件

    当我单击客户端上的按钮时 我想使用 AJAX 在服务器端调用公共静态 Web 方法 静态方法将创建适当的文件 创建文件后 我需要将其下载到客户端桌面 我找到了John Culvinar 的 jquery 文件下载插件但到目前为止还未能实施
  • 语句和关键字有什么区别?

    After calling return一份声明 这是在评论中向我提出的 return不是一个语句 它是开始 return 语句的关键字 有什么区别一份声明 and 开始语句的关键字 句子和句子开头的名词有什么区别 return是一个关键字
  • 在 Selenium for Python 中,如何获取元素的属性而不是属性?

    根据文档 获取属性实际上返回属性而不是属性 除非该属性不存在 在这种情况下它会回退到属性 获取属性将始终归还财产 有没有办法始终获取该属性 我觉得奇怪的是 名为 get attribute 的函数会优先考虑属性值而不是属性值 获取属性 属性
  • 如何使用 Tesseract API 迭代单词?

    我正在尝试与 Tesseract API 并行地学习 Python 我的最终目标是学习如何使用 Tesseract API 来读取文档并进行一些基本的错误检查 我发现了一些似乎是不错的起点的示例 但我无法理解两段代码之间的差异 尽管行为不同
  • 如何通过 Facebook API 发布包含多张照片的状态?

    我的 Facebook Graph API 有问题 有没有办法使用 Graph API Javascript SDK 在状态帖子中附加多张照片 使用 iOS Facebook 应用程序可以发布包含多张照片的状态 然而 在浏览了互联网上的文档
  • 您可以在加载的项目上创建 VC++ 解决方案集预处理器 #defines 吗?

    我有一个支持 define 的库来控制它的构建方式 然而 该库可以被需要不同版本的多个 EXE 项目使用 我可以让 app EXE 项目设置 define 在构建时由库使用 或者在解决方案中设置吗 我能想到的唯一其他选择是在库项目上创建一个
  • 结账 woocommerce wordpress 中简短描述的解决方案对我不起作用

    我已经使用了我在这里找到的 brasofilo 提供的解决方案结帐 woocommerce wordpress 中的简短描述 但由于某种原因 每个产品的每个描述后都会添加一个冒号 我用萤火虫试图找出它可能来自哪里 它显示在结帐页面上显示的每
  • 返回 Python CGI MySQL 脚本的输出

    我对 Python 和 MySQL 非常陌生 这是我的第一个 Stack 问题 所以 如果我遗漏了一些明显的东西 请提前道歉 但是 在提问之前我确实尝试过研究一下 我正在尝试学习 Python MySQL 和 CGI 脚本编写的基础知识 为
  • 从 k8s 入口动态添加/删除命名主机

    我正在 GKE 上设置 k8s 集群 通配符 DNS server com将指向入口控制器 在集群内部 将有网络服务器 Pod 每个 Pod 都公开一个独特的服务 Ingress 控制器将使用服务器名称来路由到各种服务 服务器几乎每天都会被
  • 当泄漏工具未显示内存泄漏时,如何调试内存泄漏?

    我有一个用 Swift 编写的 iOS 应用程序 该应用程序正在泄漏内存 在某些情况下 一些对象应该被释放 但它们没有 我通过简单地添加了解了这个问题deinit调试消息如下 deinit println DEINIT KeysProvid