使用Mac上的Instruments进行内存泄漏检查

时间:2010-06-26 03:38:29

标签: c++ xcode memory-leaks macos 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;
}

基本上,仪器从未发现明显的泄漏。我为什么要疯了,但随后在泄漏面板下的“泄漏配置”面板中发现了“自动检测之间的秒”。我把它拨回原来的最低点,这是1秒,然后将睡眠(2)放入我的代码中,瞧不起;泄漏发现了!

就我而言,泄漏是泄漏,无论是在应用程序30分钟内发生还是30毫秒。在我的情况下,我将测试用例剥离回上面的代码,但我的真实应用程序是一个没有UI或任何东西的命令行应用程序,它运行得非常快;肯定小于默认的10秒采样间隔。

好的,所以我可以在我的应用程序退出检测模式时使用几秒钟,但我真正想要的,就是在退出时简单地让Instruments快照内存,然后在应用程序时随时执行任何需要的操作运行

所以...问题是:无论采样间隔是什么,有没有办法在退出应用程序时使仪器快照存储器?

干杯,

沙恩

3 个答案:

答案 0 :(得分:3)

仪器处于泄漏模式对于泄漏跟踪非常有用,但我发现它比基于事件的GUI应用更偏向于命令行程序(特别是那些在短时间后退出的程序)。曾经有一个CHUD API,您可以在其中以编程方式控制检测的各个方面,但上次我尝试过时,框架不再作为SDK的一部分提供。也许其中一部分已被Dtrace替换。

另外,请确保您与Xcode保持同步,因为此区域最近有一些改进,可能更容易满足您的需求。您还可以在退出之前保持短暂延迟,但要以环境变量的存在为条件,然后在应用程序的仪器启动属性中设置该环境变量,以便在仪器外运行没有延迟。

答案 1 :(得分:1)

大多数单元测试代码执行所需的代码路径并退出。虽然这对于单元测试来说是完全正常的,但它会为泄漏工具带来问题,这需要时间来分析进程内存空间。要解决此问题,您应确保在完成测试后不会立即退出单元测试代码。你可以通过让进程无限期地进入睡眠而不是正常退出来做到这一点。

https://developer.apple.com/library/ios/documentation/Performance/Conceptual/ManagingMemory/Articles/FindingLeaks.html

答案 2 :(得分:0)

我刚刚决定在调试+泄漏构建期间留下2秒的延迟。