私は環境'ABORTING: HEAP MEMORY CORRUPTION'
上の問題に直面していAndroid NDK
ます。
でバックトレースするとndk-gdb
、主にmalloc/dlfree
関数で発生しlibc.so
、問題を長時間追跡した後、ほとんどがsqlite3_xxx
関数呼び出し内で発生し、 iOS
env で完全に正常に動作します。
どこに深く入り込む必要があるのか わかりません。
誰かが同様の問題に遭遇して修正しましたか?
私は環境'ABORTING: HEAP MEMORY CORRUPTION'
上の問題に直面していAndroid NDK
ます。
でバックトレースするとndk-gdb
、主にmalloc/dlfree
関数で発生しlibc.so
、問題を長時間追跡した後、ほとんどがsqlite3_xxx
関数呼び出し内で発生し、 iOS
env で完全に正常に動作します。
どこに深く入り込む必要があるのか わかりません。
誰かが同様の問題に遭遇して修正しましたか?
私のプログラムでは、「ABORTING: HEAP MEMORY CORRUPTION」は、スレッド セーフの問題がある場合に表示されます。特に Cocos2d-x フレームワークでは、 Android でアトラスをロードすると同時にそのgetFileData()
機能ZipUtils
がクラッシュする場合があります。コードはiOSで正常に動作しますが。.plist
addImageAsync()
私はメモリの問題を見てきましたが'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() でゼロにしました。もう 1 つのトリックは、より大きなチャックを割り当て、最後にガード値を配置することです。その値が破損した場合-わかります。
Java ヒープの場合は、ネイティブ関数の呼び出しをログに記録する必要があります (私自身、Java ヒープで問題が発生したことは一度もありません。通常、Java は JNI 固有のものについて文句を言います)。