Android 中止:NDK env上的堆内存损坏。(POCO库、Sqlite3、Cocos2dx)
我在Android 中止:NDK env上的堆内存损坏。(POCO库、Sqlite3、Cocos2dx),android,sqlite,android-ndk,cocos2d-x,poco-libraries,Android,Sqlite,Android Ndk,Cocos2d X,Poco Libraries,我在Android NDK环境中面临中止:堆内存损坏问题 如果我使用ndk-gdb回溯,它主要发生在libc.so中的malloc/dlfree函数上 经过长时间的跟踪,问题主要发生在sqlite3_xxx函数调用中,这在iOSenv上绝对可以正常工作 我就是找不到我必须深入的地方 是否有人遇到过类似的问题并已修复 我见过内存问题,但没有看到您报告的“中止:堆内存损坏” 您必须找出哪个堆已损坏:Java堆还是C/C++堆。或者它可能是您的sql。如果日志没有提供信息,您可以尝试在二进制文件中查找
Android NDK
环境中面临中止:堆内存损坏问题
如果我使用ndk-gdb
回溯,它主要发生在libc.so中的malloc/dlfree
函数上
经过长时间的跟踪,问题主要发生在sqlite3_xxx
函数调用中,这在iOS
env上绝对可以正常工作
我就是找不到我必须深入的地方
是否有人遇到过类似的问题并已修复
我见过内存问题,但没有看到您报告的“中止:堆内存损坏”
您必须找出哪个堆已损坏: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__)
#包括
#定义LOGD(…)\uuuuuAndroid\uLog\uPrint(android\uLog\uDebug,“~~~~~~~”,\uuuuuVA\uargs)
#定义DLOG(…)\uuuuuAndroid\uLog\uPrint(android\uLog\uDebug、“~~~~~~~”、\uuuVA\uArgs)
我还使myMalloc()将分配的内存归零——以防万一。另一个技巧是分配一个更大的卡盘,并在其末端放置一个保护值。如果这个值被破坏了——你看
如果是Java堆,则必须记录本机函数调用(我本人从未在Java堆中看到过问题,通常Java会抱怨其JNI特定的东西)
对于我的程序,“中止:堆内存损坏”显示线程安全问题。特别是在Cocos2d-x框架中,ZipUtils
的getFileData()
功能在Android上加载.plist
atlas和addImageAsync()
时可能会崩溃。尽管这些代码在iOS上运行良好。谢谢。你的答案是一条黄金法则,至少所有开发人员都应该尝试,但我觉得我太懒了。顺便说一句,我选择了肮脏的方式写日志来检查代码在哪里崩溃,我发现我被堆栈跟踪所迷惑。代码实际崩溃的地方是对POCO::NotificationQueue类的enqueueXXX的调用。我想我犯了一些错误。有趣的是,iOS设备从未抱怨过这一点。到目前为止,我一直认为一定有一些特定的编译器选项或其他构建设置需要检查。再次感谢。你解决了这个问题吗?我也在讨论同样的问题