gpt4 book ai didi

c - 使用 Instruments 检测 C/C++ 命令行内存泄漏

转载 作者:行者123 更新时间:2023-12-04 10:09:29 26 4
gpt4 key购买 nike

我正在尝试检测 macOS 上 C(和 C++)程序中的内存泄漏。在 Linux 和 Windows 中,我可以使用 valgrind 轻松做到这一点。 ,但不幸的是,它在 macOS 上不可用。

由于我有 ObjC 和 iOS 开发的背景经验,我想使用 Instruments 来进行内存泄漏检查。乍一看,这听起来很适合这份工作。

我写了这个非常简单的泄露程序:

#include <stdlib.h>
#include <stdio.h>

int* allocSomething() {
return malloc(sizeof(int));
}

int main(int argc, const char * argv[]) {
int* p = allocSomething();
*p = 5;
printf("*p = %d\n", *p);
p = NULL;
return 0;
}

我通过 Clang Static Analyzer 运行它,它完成了这项工作,但我希望它也能被 Instruments 捕获,因为我正在寻找合适的 Valgrind 替代品。因此:
  • 我将 Profile 架构更改为使用 Debug 而不是 Release。
  • 我确保没有优化。

  • 但是,在使用 Instruments 后:
    Instruments does not detect leaks

    如您所见,没有泄漏报告。
    在网上搜索后,我遇到了 Can't detect C leaks in xcode 9 instruments ,其中作者使用了 sleep ,所以我想也许仪器实际上并没有覆盖 malloc和 Valgrind 一样,但是使用了采样技术,而且它不会在这么短的时间内对其进行采样,因此我将程序更改为:
    int main(int argc, const char * argv[]) {
    int* p = allocSomething();
    p = NULL;
    sleep(600000);
    return 0;
    }

    现在,我得到:
    no leak at all

    这完全没有意义,因为这是一个明显的内存泄漏。
    我会说它必须做一些优化,但我再次明确禁用了它。另外,如果我 malloc更多字节,它确实检测到它。或者它可能是 Instruments 中的一个错误?

    所以我想知道这是不是 Instruments 无法检测到小分配的问题?我必须注意到 Valgrind 可以很好地处理它,所以我很惊讶。

    你有什么建议吗?

    最佳答案

    Leaks 工具(Leaks 模板中的工具之一)的工作方式与您预期的不同。

    首先,为什么它没有检测到短期进程的任何东西:它是基于计时器的。它每隔一段时间就会停止该过程并检查是否有泄漏。对于短期进程,在进程退出之前不会进行检查。

    其次,为什么它会漏掉一些泄漏:它检查所有线程的堆栈、所有线程的寄存器以及查找分配地址的全局变量。如果在任何这些地方找到分配的地址,则不会认为该分配已泄漏。

    在您的情况下,分配的地址可能仍在寄存器或堆栈内存中。在“真正的”程序中,堆栈和寄存器最终会被重用,这样的陈旧数据将被消除。

    Allocations 工具会跟踪所有的分配和释放(假设该过程是由 Instruments 启动的)。您泄漏的分配在分配列表中,并且仍列为“实时”(也称为已创建和持久)。问题是分配工具没有明确地将这种分配称为泄漏。

    此外,系统库还进行了分配,旨在在进程退出之前继续存在并且不会明确清除。因此,您的泄漏有点隐藏在不相关的信息中。您可以对分配列表进行过滤和排序以发现泄漏,但这需要做一些事情。

    在一个更真实的程序的上下文中,Instruments 非常擅长发现泄漏。

    显然,Clang 支持 LeakSanitizer ,作为 AddressSanitizer 的一部分或独立的。这可能需要一个比 Apple 作为 Xcode 和/或 Catalina 的一部分提供的版本更新的 Clang 版本。 (我在 Mojave 上用 Xcode 11.3.1 进行了测试。它不支持 -fsanitize=leak 选项,也不支持 ASAN_OPTIONS=detect_leaks=1。)假设你可以让它工作,那可能表现得更像你期望的.

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

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com