【问题标题】:how to use ddms for memory leaks in c++ code如何在 C++ 代码中使用 ddms 处理内存泄漏
【发布时间】:2013-03-01 10:45:37
【问题描述】:

如何使用android工具DDMS解决c++代码中的内存泄漏问题 我尝试通过启用 NativeHeap 拍摄快照,但我不明白 快照在说什么,符号没有解析,没有显示文件名和行号。

【问题讨论】:

    标签: android android-ndk ddms


    【解决方案1】:

    DDMS 中的本机堆跟踪是一项不受支持的“隐形”功能。让它工作可能有点棘手。邮件列表中有一个older discussion 可能有用。

    如果您正在接收数据并启动 UI,那么您已经成功了一半。 :-) DDMS 在特定位置查找符号,您应该能够使用 ANDROID_SYMBOLS 环境变量覆盖该符号,并将地址转换为带有 addr2line 的行(它也必须能够找到)。

    查找大泄漏的最简单方法是配置 DDMS 以按库对分配进行排序。让应用程序运行一段时间,看看哪个库似乎增长最快。查看归属于该库的分配,看看是否有很多来自同一个地方。查看堆栈跟踪,看看从那里进行许多长期分配是否有意义。不是很严格,但通常可以解决问题。

    要更彻底地检查堆,您可以在设备上运行 valgrind,但第一次设置并不容易。

    【讨论】:

    • 我使用了调试符号,现在符号正在被解析,并显示代码的函数名称、地址和行号。现在我正在运行应用程序,并使用了一个功能,例如:打开关于选项并查看有关应用程序的信息(版本、信用)、对应用程序类型的项目进行评分的链接,然后从关于视图返回应用程序。现在在这种情况下是否有可能找到泄漏。
    • 如果您重复该过程 10 次,并且每次都在泄漏对象,您应该会看到 10 个具有相同堆栈跟踪的分配副本。如果您可以“检查点”较早的运行并区分分配,则会更有效,但有时只需查看分配,问题就会突然出现。如果有用,您可以使用adb shell am dumpheap -n <pid> /sdcard/dump.txt 获取“原始”数据。
    • 非常感谢。它工作得很好,我发现这个漏洞真的很大。 ----------------------------- 对于某些情况,我不能多次运行场景,例如使用用户 ID 登录.那种情况是无法涵盖的。欢迎对这些案例提出任何建议。
    • 您可以使用此环境变量指定addr2line 的路径:ANDROID_ADDR2LINE
    【解决方案2】:

    使用分配跟踪器。这是关于在 Android 中查找内存泄漏的精彩讨论:http://www.youtube.com/watch?v=_CruQY55HOk

    这里有一篇关于它的博文:http://www.curious-creature.org/2009/02/07/track-memory-allocations-on-android/

    【讨论】:

    • 博客文章对于理解内存泄漏的概念非常有用。我刚刚尝试了这篇文章,它显示了 java 代码中的分配。但我正在寻找适用于 c++ 代码的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多