c++ - 在 Mac 上使用 Instruments 检查内存泄漏

标签 c++ xcode memory-leaks macos instruments

我一直在努力让 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 快照内存,然后在应用程序运行时随时间执行任何需要的事情运行。

那么...问题是:有没有办法在应用程序退出时创建 Instruments 快照内存,而不管采样间隔如何?

干杯,

谢恩

最佳答案

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

此外,请确保您使用 Xcode 是最新的,因为最近在这方面进行了一些改进,这可能会让您更轻松地完成所需的工作。您还可以在退出前保留短暂的延迟,但以环境变量的存在为条件,然后在您的应用程序的 Instruments 启动属性中设置该环境变量,以便在 Instruments 外部运行不会有延迟。

关于c++ - 在 Mac 上使用 Instruments 检查内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3122617/

相关文章:

c++ - 在循环中声明变量是否有效?

iphone - 如何将 AirPlay 集成到我的应用程序中?

iphone - 如何在我的 iOS 应用程序中创建带有 Web 操作的表单?

javascript - 动态加载的JavaScript可以卸载吗?

objective-c - 如何判断这个内存泄漏是从哪里来的呢?

c++ - 从静态函数访问静态变量

c++ - 使用较新的编译器缩小转换错误

c++ - '获取用户名A' : cannot convert parameter 2 from 'int' to 'LPDWORD'

xcode - Xcode 4.5 (Mountain Lion) 中的选项卡切换非常慢

javascript - 重命名 'this' 关键字