Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 中止:NDK env上的堆内存损坏。(POCO库、Sqlite3、Cocos2dx)_Android_Sqlite_Android Ndk_Cocos2d X_Poco Libraries - Fatal编程技术网

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设备从未抱怨过这一点。到目前为止,我一直认为一定有一些特定的编译器选项或其他构建设置需要检查。再次感谢。你解决了这个问题吗?我也在讨论同样的问题