iOS libsystem_c.dylib strdup 内存泄漏 NSZombie 无效

8
请帮我追踪一个iOS内存泄漏问题。谢谢!
我正在使用xCode 4.0.1,尝试激活NSZombie来跟踪内存泄漏,但似乎与xCode 3.x不同。
由于Instruments指出以下内容,我找不到内存泄漏的来源:
泄漏对象 -> GeneralBlock-32 地址 -> 0x4c8600 大小 -> 32字节 负责库 -> libsystem_c.dylib 负责帧/调用者 -> strup 此时,我不知道是否正确地在xCode 4中使用Instruments和NSZombie,因为当我单击“i”以获取更多信息时,在左侧选项Leaks下不显示NSZombie选项。
观察:我的iPhone应用程序播放具有有限时间的实时流mms/wma和wma音频文件。泄漏仅发生在有限的wma文件中,但在播放无结束时间的流源时运行完美。
2个回答

10

首先,那是一个malloc块,而不是对象。 僵尸对象无法工作(并且在之前的版本中也永远无法工作)。

那个泄漏会发生多少次? 一次?不用担心。每个流程都发生一次?请提出错误报告-从您目前发布的代码来看,这不是您的代码中的问题(除非您的代码调用了strdup,但在大多数未大量使用第三方库的iOS应用中,这种情况是不典型的... 您是吗?)

无论如何,除非它在您的应用程序运行时泄漏了数百个32字节的分配,否则不用担心(但请确实提出错误报告)。

正如Valkio所说,您可以直接从gdb(或Instruments)中获取分配的堆栈跟踪。


感谢您的考虑,bbum。我会提交一个错误报告。是的,我正在大量使用第三方库:LibMMS(用于解析音频流)和FFMPeg(用于解码/播放)WMA文件。在这种情况下,我应该寻找什么?因为当我打开第二个流时,在第一个流结束时,当我手动停止音频时,我的应用程序会崩溃。除非我使用的库正在执行此操作,否则我不会自己调用strdup。更新:是的,当LibMMS建立mms连接时,它会调用strup。 - neowinston
如果 bug 报告是关于第三方库的,那它可能对你没什么用。这听起来像是库中的一个泄漏。崩溃可能是正交的(尽管它可能归结为库中的内存管理问题),并值得另一个问题。 - bbum

5
如果你按照以下步骤操作,就可以看到内存的分配情况:
1. 进入Product -> Edit Scheme -> Run(Debug) -> Arguments。 2. 添加这个环境变量:MallocStackLoggingNoCompact。 3. 将它设为YES。 4. 运行程序,让它崩溃。 5. 在控制台中输入(gdb) info malloc 0x4c8600或者其他地址。

2
你也可以在Instruments中完成这个操作,不需要使用gdb;只需在Instruments中点击分配地址,它就会显示分配的堆栈跟踪。 - bbum
感谢您的回答,vakio。我按照您的指示操作,在(gdb)中输入info malloc 0x464890时,它给出了以下输出:MyAppName (330) > 这个330是什么意思? - neowinston
嗯,那不对。你应该得到一个malloc堆栈。也许在这种情况下使用instruments会更好... - vakio
请看一下我对bbum的回复,谢谢。 - neowinston
我遇到了同样的问题,只不过它是以48字节的增量泄漏而不是32字节。我正在使用iOS 5.1,泄漏似乎与UIScrollView滚动图像有关。泄漏似乎不太严重,但我仍然想知道我做错了什么。 - Jackson
1
有人解决了这个小型malloc泄漏的问题吗?我现在遇到了这个问题,当这些错误堆积起来时,它们会导致我的应用程序崩溃... - Sylphos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接