2

我遇到了许多使用最新版本的 XCode 的实例(我相信这从 4.2 左右开始发生),其中抛出异常时的堆栈跟踪非常缺乏细节。

这里的截图说明了一种这样的情况;事实上,这个场景至少有一些上下文(它告诉我它发生在 JKArray 类中),很多时候我只得到“内部”堆栈项(线程中只有 2-3 个条目,没有一个驻留在用户代码或我可以查看的任何内容)。即使在这个例子中,我也不知道 JKArray 是在哪里分配或释放的,所以我不知道是什么实例或问题出在哪里。

在此处输入图像描述

想法:

  • 我尝试添加一个通用的“异常”断点
  • 输出中有一些次要信息;在这种情况下:“ malloc:* 对象 0x10e18120 的错误:未分配被释放的指针 *在 malloc_error_break 中设置断点以进行调试”。但是,这样做并没有让我更进一步,因为断点与异常在同一个堆栈中被击中......
  • 我试过切换到另一个调试器
  • 我试过使用我自己的自定义异常处理程序
  • 我尝试使用 Profiler 来查找泄漏。我找不到任何泄漏。

无论我做什么,我似乎都无法隔离困扰我的应用程序的问题。此外,问题似乎每次都不完全相同,可能是由于我的应用程序中的大量并发......所以我没有解决问题的好方法。


编辑:在这个特殊异常的情况下,我最终找到了原因。我曾尝试 [释放] 和 [autoreleased] d 的对象。但是,所有这些都发生在我的代码中;我不明白为什么 XCode 不会给我一个像样的堆栈跟踪来帮助我找到问题,而不是强迫我搜索我的整个应用程序......

4

1 回答 1

1

有时无法确定真正的问题,因为导致症状的问题发生得更早。

你的问题提供了一个很好的例子:当你释放你的对象时,可可不知道你做错了什么:你正在释放一个你拥有的对象,这正是你应该做的,所以没有危险信号。导致崩溃的代码在您的方法完成后很好地执行,并将控制权交还给运行循环。正是在这一点上,运行循环开始耗尽其自动释放池,从而导致第二次释放。然而,此时它所知道的只是运行循环进行了无效的释放,而不是您的代码。当错误发生时,罪魁祸首已经安全地离开堆栈(并且脱离了钩子),因此 Xcode 无法向您报告任何其他内容。

解决此类问题的方法是分析您的内存使用情况:分析器应该捕获此类问题,并查明它们发生的位置。

不用说,切换到自动引用计数将为您在内存管理部门省去很多麻烦。

于 2012-07-29T03:43:46.287 回答