【问题标题】:LLDB: Show all objects with a pointer to an object in memoryLLDB:使用指向内存中对象的指针显示所有对象
【发布时间】:2013-05-29 03:30:31
【问题描述】:

所以,在断点处,我有一个随机对象实例。我想弄清楚哪些对象具有指向该对象的指针。有没有办法在调试器控制台中看到这个?也许可以向我展示所有在对象上有保留的对象?

示例:我有一个NSViewController 实例,我想查看所有其他持有该视图控制器实例指针的对象。这会很有帮助,因为它可以让我看到封装我的实例的视图控制器层次结构。

只是我有一个疯狂的想法,有时会真的很有帮助。

【问题讨论】:

  • 我不确定这是否可能。甚至运行时也不会维护这种信息,因为这意味着孩子知道它的父母(它违反了依赖规则)。
  • 也许你是对的。我在想更多的是对包含指向 0x2827 的指针的对象进行愚蠢的内存搜索......
  • 不过,愚蠢的内存搜索不会找到对象。它会找到数据,但它不知道它代表什么。
  • 使用lldb 做到这一点并不容易。但是您可能想查看分配工具。它可以显示每个retainreleaseautorelease 对象的堆栈跟踪。查看this answer 以获取入门帮助。

标签: objective-c debugging lldb


【解决方案1】:

不是一个有效的解决方案,或者适用于所有情况,但您可以将您正在寻找的对象封装在您的一个类的访问器方法中,并在其中放置一个断点。通过遍历访问器方法的末尾,您最终可以看到所有的调用点。

或者,您可以删除变量的定义,编译器会吐出大量错误,每个错误也是对该对象的调用。

如果您还没有,我建议您使用 ARC。理想情况下,您的代码不会过于混乱,以至于您无法通过阅读代码来识别引用,ARC 可以在该部门提供一些帮助

【讨论】:

    【解决方案2】:

    在lldb中,使用command script import lldb.macosx.heap安装一些内存搜索功能。 ptr_refs 命令应该可以做你想做的事;使用ptr_refs --help了解更多信息。

    【讨论】:

    • ptr_refs 是要走的路。如果您使用MallocStackLogging=1 环境变量启动您的应用程序,您可以执行ptr_refs --stack ADDRESS,不仅可以查看包含该地址的所有内存块,还可以查看分配或释放该对象/内存块时的回溯。请注意,ptr_refs 目前仅适用于 Mac OS X 应用程序 - 它在 Xcode 4.6 中的实现方式使其无法在 iOS 上运行。
    • 借助 Xcode 6.3,我成功地在设备 (iOS 7.1.2) 和模拟器 (iOS 8.3) 上运行的 iOS 应用程序上使用了ptr_refs,因此看起来它不仅限于 Mac OS X 了。
    • @user2067021,你导入了什么让它工作? lldb.ios.heap 似乎不存在
    • @lulianOnofrei 刚刚在 iOS 设备 (9.3.2) 上使用 Xcode 7.3.1(使用 lldb.macosx.heap)再次尝试,它非常不稳定。在我尝试过的大多数堆栈帧中,它都会使 Xcode 崩溃,尽管偶尔我会得到一个合理的结果。现在看起来不太可靠。
    • 我听说早些时候存在兼容性问题,但我最近一直在尝试使用 command script import lldb.macosx.heap 为 iOS 应用程序使用它,它运行得很好。 stackoverflow.com/questions/62310636/… 有一个详细的示例,说明如何使用它来查找源代码中指向特定对象的行。
    猜你喜欢
    • 2017-12-06
    • 2023-02-09
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多