我面临环境'ABORTING: HEAP MEMORY CORRUPTION'
问题Android NDK
。
如果我用 回溯ndk-gdb
,它主要发生在
长时间跟踪问题的malloc/dlfree
函数中和之后,它主要发生在函数调用内部,这在env上绝对可以正常工作。libc.so
sqlite3_xxx
iOS
我只是找不到我必须深入的地方。
有没有人遇到过类似的问题并解决了?
我面临环境'ABORTING: HEAP MEMORY CORRUPTION'
问题Android NDK
。
如果我用 回溯ndk-gdb
,它主要发生在
长时间跟踪问题的malloc/dlfree
函数中和之后,它主要发生在函数调用内部,这在env上绝对可以正常工作。libc.so
sqlite3_xxx
iOS
我只是找不到我必须深入的地方。
有没有人遇到过类似的问题并解决了?
我见过内存问题,但不是'ABORTING: HEAP MEMORY CORRUPTION'
你报告的。
您必须找出损坏的堆:Java 堆或 C/C++ 堆。或者它可能是你的 sql。如果日志没有提供信息,您可以尝试在二进制文件中找到错误消息。
如果是 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() 将分配的内存归零——以防万一。另一个技巧是分配一个更大的卡盘并在其末尾放置一个保护值。如果该值损坏-您会看到。
如果是 Java 堆,则必须记录本机函数调用(我本人从未见过 Java 堆中的问题,通常 Java 会抱怨其 JNI 特定的东西)。
对于我的程序,'ABORTING: HEAP MEMORY CORRUPTION' 会在出现线程安全问题时显示。特别是 Cocos2d-x 框架,它的getFileData()
功能ZipUtils
可能会在加载.plist
图集addImageAsync()
时同时在 Android 上崩溃。虽然代码在 iOS 上运行良好。