АБОРТИРОВАНИЕ: КОРРУПЦИЯ КОРПОРАЦИИ КАРТОЧКИ НА NDK env. (Библиотека POCO, Sqlite3, Cocos2dx)

Я столкнулся с проблемой 'ABORTING: HEAP MEMORY CORRUPTION' в среде Android NDK .

Если я возвращаюсь с помощью ndk-gdb , это происходит в основном в libc.so malloc/dlfree в libc.so и после долгих часов отслеживания проблемы это происходит главным образом внутри вызовов функций sqlite3_xxx , которые полностью работают на iOS env.

Я просто не могу найти, где мне нужно углубляться.

Кто-нибудь сталкивался с подобной проблемой и исправлялся?

  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-специфические вещи).

Для моей программы «ABORTING: HEAT MEMORY CORRUPTION» показывает, когда есть проблемы с безопасностью потоков. В частности, с каркасом Cocos2d-x, его getFileData() ZipUtils может сбой при загрузке атласа addImageAsync() и addImageAsync() одновременно на Android. Хотя коды отлично работают на iOS.