C / C++程序员,毫无疑问,最头痛的问题是内存泄漏的问题。解决内存泄漏问题似乎很简单,这是一个原则,即必须立即所分配的内存。然而,在实际场景中,随着代码复杂度的增加,很难遵循这一原则。随着面向对象、模块化和多线程的引入,决定谁内存变得更加困难。为了解决这个问题,C++引入了智能指针和引用计数。但是,引用计数不能解决由两个对象互相引用引起的内存泄漏。在Android中,引入了强指针(SP)和弱指针(WP),试图解决两个对象相互参照的困境。然而,当球被抛给程序员时,程序员需要决定何时使用强指针以及何时定义弱指针。所以这个方案能不能解决内存泄漏问题非常喜欢java的GC。
由于内存泄漏似乎不可避免,我们需要做的是检查程序是否有内存泄漏并定位内存泄漏代码,然后解决它。这个过程不是那么简单,尤其是Android的C++代码。本文探讨的就是如何检查Android C++代码的内存泄漏,一个基于文档的Android原生内存:调试使用,但是这篇文章太简单,再加上Android系统和Android工具快速升级,一些方法在新的下是不合适的,咨询一些网络组合与实际数据和调试后,我们做了一个总结。
有时我们在网上找到一篇文章,但我们必须做这个或那个问题。究其原因是计算机技术发展得太快,各种软件版本频繁迭代,也不同。该方法可能需要做一些修改。本文所述方法需要两个先决条件:
与Android源代码相对应的Android系统版本,从Android源编译出我们需要的库。
找到隐藏的文件夹为家。开发商$HOME目录下的Android,并添加一行本地=真正的ddms.cfg文件里面
最新的Android Studio Android设备提供,将DDMS的旧版本,但功能集成的版本是不完整的,所以请工具Android工具,老版本下载地址:
你可以看到,DDMS界面有一个本机堆的标签页,切换到本地堆页面,选择在进程列表左侧的调试程序的过程,然后点击快照当前本机堆使用的按钮,抓住一个应用程序的本机内存泄漏,包含堆栈地址泄漏。
在获取内存地址之后,我们还需要找到要执行的代码。需要注意的是,在加载和定位重要,动态链接库不能简单地通过addr2line工具找到的代码行。我们需要找到加载在内存中的基址。
这个malloc调试的原理是:当我们发现的libc.debug.malloc系统配置,系统将被重定向到分配//新建/删除方法,在实施方法的相应lib_malloc_debug_leak.so,方法lib_malloc_debug_leak.so,一些记录信息,地址和其他信息将被记录,每次下堆栈。在需要的时候,通过工具DDMS转储,分析每个应用程序的内存,无论是正常,以及是否存在内存泄漏。
通过一个简单的例子说明了该方法的可行性。在实际项目中,可能是由于使用了内存缓存和内存池。可能的不是真正的内存泄漏,这需要程序员做出判断。也有可能,即使泄漏被发现,它将需要很多努力来解决它。无论如何,找出可疑的内存泄漏,是长征的第一步
网友评论 ()条 查看