社区首页 >问答首页 >在Mac上使用仪器检查内存泄漏

在Mac上使用仪器检查内存泄漏
EN

Stack Overflow用户
提问于 2010-06-25 19:38:29
回答 3查看 4K关注 0票数 4

我一直在拔头发,试图让仪器咳出我故意制造的记忆泄漏。我的测试示例如下所示:

代码语言:javascript
代码运行次数:0
复制
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秒示例间隔要小。

好的,我可以在我的应用程序以插装模式退出时保持几秒钟的时间,但我真正想要的是,在退出时,只需在工具快照内存中,然后在应用程序运行时,随时间做它所需要的任何事情。

所以..。问题是:是否有一种方法可以在应用程序退出时使仪器快照内存,而不管采样间隔是多少?

干杯,

沙恩

EN

回答 3

Stack Overflow用户

发布于 2010-06-28 14:20:06

工具,在泄漏模式下可以真正强大的泄漏跟踪,但我发现它更倾向于基于事件的GUI应用程序,而不是命令行程序(特别是那些在短时间后退出)。过去有一个CHUD API,您可以通过编程控制工具的各个方面,但上次我尝试它时,框架不再作为SDK的一部分提供。也许其中的一些现在被德特里斯取代了。

此外,确保您最新的Xcode,因为最近在这方面有一些改进,这可能使您更容易完成您需要的事情。您还可以在退出之前保留较短的延迟,但以环境变量的存在为条件,然后在应用程序的could启动属性中设置该环境变量,这样运行外部设备就不会有延迟。

票数 3
EN

Stack Overflow用户

发布于 2015-05-22 04:06:59

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

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

票数 1
EN

Stack Overflow用户

发布于 2010-07-06 21:13:53

我刚刚决定在我的debug+leaking构建过程中留下2秒的延迟。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3122617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档