我一直在绞尽脑汁地试图让 Instruments 弥补我故意构造的内存泄漏。我的测试示例如下所示:
class Leaker
{
public:
char *_array;
Leaker()
{
_array=new char[1000];
}
~Leaker()
{
}
};
void *leaker()
{
void *p=malloc(1000);
int *pa=new int[2000];
{
Leaker l;
Leaker *pl=new Leaker();
}
return p;
}
int main (int argc, char **argv)
{
for (int i=0; i<1000; ++i) {
leaker();
}
sleep(2); // Needed to give Instruments a chance to poll memory
return 0;
}
基本上Instruments从来没有发现明显的泄漏。我很想知道为什么,但后来在“泄漏”面板下的“泄漏配置”面板中发现了“自动检测之间的秒数”。我将其调回尽可能低的值,即 1 秒,并将 sleep(2) 放入我的代码中,瞧;发现泄漏!
就我而言,泄漏就是泄漏,无论它是发生在应用程序 30 分钟内还是 30 毫秒内。就我而言,我将测试用例剥离回上面的代码,但我真正的应用程序是一个没有 UI 或任何东西的命令行应用程序,并且运行速度非常快;当然小于默认的 10 秒采样间隔。
好的,所以我可以在仪器模式下退出我的应用程序时忍受几秒钟,但我真正想要的是在退出时简单地拥有仪器快照内存,然后在应用程序运行时随着时间的推移执行它需要的任何操作。
所以...问题是:有没有一种方法可以在应用程序退出时使 Instruments 快照内存,而不管采样间隔如何?
Cheers,
Shane
泄漏模式下的仪器对于泄漏跟踪来说非常强大,但我发现它比命令行程序(尤其是那些短时间后退出的程序)更偏向于基于事件的 GUI 应用程序。曾经有一个CHUD API您可以通过编程方式控制仪器的各个方面,但上次我尝试时,框架不再作为 SDK 的一部分提供。也许其中一些现在被替换为Dtrace.
另外,请确保您使用的是最新的 Xcode,因为这方面最近有一些改进,这可能会让您更轻松地完成您需要的操作。您还可以在退出前保留短暂的延迟,但使其以环境变量的存在为条件,然后在应用程序的 Instruments 启动属性中设置该环境变量,以便在 Instruments 外部运行时不会有延迟。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)