4

私は環境'ABORTING: HEAP MEMORY CORRUPTION'上の問題に直面していAndroid NDKます。

でバックトレースするとndk-gdb、主にmalloc/dlfree関数で発生しlibc.so 、問題を長時間追跡した後、ほとんどがsqlite3_xxx関数呼び出し内で発生し、 iOSenv で完全に正常に動作します。

どこに深く入り込む必要があるのか​​ わかりません。

誰かが同様の問題に遭遇して修正しましたか?

4

2 に答える 2

3

私のプログラムでは、「ABORTING: HEAP MEMORY CORRUPTION」は、スレッド セーフの問題がある場合に表示されます。特に Cocos2d-x フレームワークでは、 Android でアトラスをロードすると同時にそのgetFileData()機能ZipUtilsがクラッシュする場合があります。コードはiOSで正常に動作しますが。.plistaddImageAsync()

于 2013-07-13T01:18:21.520 に答える
3
  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() でゼロにしました。もう 1 つのトリックは、より大きなチャックを割り当て、最後にガード値を配置することです。その値が破損した場合-わかります。

  4. Java ヒープの場合は、ネイティブ関数の呼び出しをログに記録する必要があります (私自身、Java ヒープで問題が発生したことは一度もありません。通常、Java は JNI 固有のものについて文句を言います)。

于 2013-03-05T08:22:16.287 に答える