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

前端之家收集整理的这篇文章主要介绍了c – 使用Mac上的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快照内存,然后在应用程序运行时随时执行任何需要.

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

干杯,

巴蒂尔

解决方法

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

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

猜你在找的Xcode相关文章