如何使用 Malloc Debug 来检查本机内存泄漏?

Posted

技术标签:

【中文标题】如何使用 Malloc Debug 来检查本机内存泄漏?【英文标题】:How to use Malloc Debug for checking native memory leaks? 【发布时间】:2019-01-26 18:47:15 【问题描述】:

我正在探索几个选项来找出最好的工具/方法来找出 android 应用程序中本机代码中的内存泄漏。作为本练习的一部分,我遇到了以下 url 中的选项。

https://android.googlesource.com/platform/bionic/+/master/libc/malloc_debug/README_marshmallow_and_earlier.md

我编写了一个示例应用程序,它调用在共享库中编写的本机函数。我故意将内存泄漏放在这个本机函数中。在运行应用程序之前,我做了

    adb shell setprop libc.debug.malloc.program adb shell setprop libc.debug.malloc 10

然后我启动了应用程序。但是我在 logcat 中看不到任何表明内存泄漏的打印。

如果有人曾经使用这种方法来找出本机内存泄漏,请告诉我是否遗漏了一些东西。 logcat 日志是否是查找泄漏消息的正确位置?如果没有,我应该如何找到泄漏信息?

【问题讨论】:

哪种语言,C 或 C++?它们是不同的语言。您应该在 C++ 中使用 new 而不是 malloc,因为 malloc 不会调用对象的构造方法。 您可能需要考虑不在嵌入式系统中使用动态内存分配。内存分配可能会导致无法恢复的碎片或内存泄漏。在互联网上搜索“C++ 内存池”和“C++ 新位置”。 @ThomasMatthews android,虽然从技术上来说是一个嵌入式系统,但在内存方面肯定没有限制,内存分配也很好。它也不应该导致内存泄漏,除非使用不当。 【参考方案1】:

您应该根据应用程序的版本设置回溯。

试试这个命令:

adb shell setprop libc.debug.malloc.options backtrace 

然后取dumpheap。

【讨论】:

android.googlesource.com/platform/bionic/+/master/libc/… 请试试这个

以上是关于如何使用 Malloc Debug 来检查本机内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查是不是使用 malloc 或 new 分配了内存

如何使用 Dtrace 在 Solaris 10 上检查 malloc?

如何用VS工具检测内存泄露

我可以依靠 malloc 返回 NULL 吗?

memcached 的内存分配器是如何工作的?为什么不适用 malloc/free!?为何要使用 slabs?

memcached 的内存分配器是如何工作的?为什么不适用 malloc/free!?为何要使用 slabs?