我一直在拔我的头发试图让仪器咳嗽我故意构造的内存泄漏。我的测试示例如下所示:
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;
}
基本上,仪器从未发现明显的泄漏。我为什么要疯了,但随后在泄漏面板下的“泄漏配置”面板中发现了“自动检测之间的秒”。我把它拨回原来的最低点,这是1秒,然后将睡眠(2)放入我的代码中,瞧不起;泄漏发现了!
就我而言,泄漏是泄漏,无论是在应用程序30分钟内发生还是30毫秒。在我的情况下,我将测试用例剥离回上面的代码,但我的真实应用程序是一个没有UI或任何东西的命令行应用程序,它运行得非常快;肯定小于默认的10秒采样间隔。
好的,所以我可以在我的应用程序退出检测模式时使用几秒钟,但我真正想要的,就是在退出时简单地让Instruments快照内存,然后在应用程序时随时执行任何需要的操作运行
所以...问题是:无论采样间隔是什么,有没有办法在退出应用程序时使仪器快照存储器?
干杯,
沙恩
答案 0 :(得分:3)
仪器处于泄漏模式对于泄漏跟踪非常有用,但我发现它比基于事件的GUI应用更偏向于命令行程序(特别是那些在短时间后退出的程序)。曾经有一个CHUD API,您可以在其中以编程方式控制检测的各个方面,但上次我尝试过时,框架不再作为SDK的一部分提供。也许其中一部分已被Dtrace替换。
另外,请确保您与Xcode保持同步,因为此区域最近有一些改进,可能更容易满足您的需求。您还可以在退出之前保持短暂延迟,但要以环境变量的存在为条件,然后在应用程序的仪器启动属性中设置该环境变量,以便在仪器外运行没有延迟。
答案 1 :(得分:1)
大多数单元测试代码执行所需的代码路径并退出。虽然这对于单元测试来说是完全正常的,但它会为泄漏工具带来问题,这需要时间来分析进程内存空间。要解决此问题,您应确保在完成测试后不会立即退出单元测试代码。你可以通过让进程无限期地进入睡眠而不是正常退出来做到这一点。
答案 2 :(得分:0)
我刚刚决定在调试+泄漏构建期间留下2秒的延迟。