4

我面临环境'ABORTING: HEAP MEMORY CORRUPTION'问题Android NDK

如果我用 回溯ndk-gdb,它主要发生在 长时间跟踪问题的malloc/dlfree函数中和之后,它主要发生在函数调用内部,这在env上绝对可以正常工作。libc.sosqlite3_xxxiOS

我只是找不到我必须深入的地方。

有没有人遇到过类似的问题并解决了?

4

2 回答 2

3
  1. 我见过内存问题,但不是'ABORTING: HEAP MEMORY CORRUPTION'你报告的。

  2. 您必须找出损坏的堆:Java 堆或 C/C++ 堆。或者它可能是你的 sql。如果日志没有提供信息,您可以尝试在二进制文件中找到错误消息。

  3. 如果是 C/C++ 堆,对我有用的是用我自己的版本替换标准的 malloc/calloc/free。

    #define malloc(x) myMalloc(x, __FILE__,__LINE__,__func__)
    

    等等; myMalloc() 和朋友打印调试信息,以便您可以找出分配和释放内存的位置。我有库的源代码并且可以编译它。然后记录,记录,记录......

    #include <android/log.h>
    #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG  , "~~~~~~", __VA_ARGS__)
    #define DLOG(...) __android_log_print(ANDROID_LOG_DEBUG  , "~~~~~~", __VA_ARGS__)
    

    我还让 myMalloc() 将分配的内存归零——以防万一。另一个技巧是分配一个更大的卡盘并在其末尾放置一个保护值。如果该值损坏-您会看到。

  4. 如果是 Java 堆,则必须记录本机函数调用(我本人从未见过 Java 堆中的问题,通常 Java 会抱怨其 JNI 特定的东西)。

于 2013-03-05T08:22:16.287 回答
3

对于我的程序,'ABORTING: HEAP MEMORY CORRUPTION' 会在出现线程安全问题时显示。特别是 Cocos2d-x 框架,它的getFileData()功能ZipUtils可能会在加载.plist图集addImageAsync()时同时在 Android 上崩溃。虽然代码在 iOS 上运行良好。

于 2013-07-13T01:18:21.520 回答