1

これ以上言う前に、このソフトウェアは完全に正気であり、Android サンプルから取得したものであり、クラッシュしないということから始めさせてください :)。

私のチームは最近、Android から正常なバックトレースを取得するのに苦労しています。私たちは LibC から出力を取得します...これが有効なバックトレースを取得する唯一のコンポーネントのようです。それ以外のものは疑問符と浅いバックトレースのみを生成します (したがって、通常は最初に壊れます??、そのポイントを超えて何も表示されないため、通常、たとえばvsnprintfのみが表示されます...それだけです。

私たちは実験を続け、最終的にサンプルからほぼ完全にコピーされたまったく新しいプロジェクトを作成しました。

  • AndroidManifest.xml には正しいフラグが設定されています。

    <application android:label="@string/app_name" 
        android:hasCode="false" android:debuggable="true" >
    
  • build.xml にはビルド前のルールがあります。

     <target name="-pre-build">
         <exec executable="${env.ANDROID_NDK}/ndk-build" failonerror="true">
             <arg value="NDK_DEBUG=1" />
         </exec>
     </target>
    
  • Application.mkには次の定義があります。

    APP_OPTIM := debug
    
  • Android.mkファイルでさえ、いくつか調整されています。

    LOCAL_MODULE    := test
    LOCAL_SRC_FILES := main.c
    LOCAL_LDLIBS    := -llog -landroid -lEGL -lGLESv1_CM
    LOCAL_STATIC_LIBRARIES := android_native_app_glue
    LOCAL_CFLAGS := -g3 -ggdb -O0
    LOCAL_CPPFLAGS := -g3 -ggdb -O0
    include $(BUILD_SHARED_LIBRARY)
    

-gstabs+とを試してみまし-g -ggdbたが、それでも同じバックトレースが得られます。

(gdb) bt
#1  0x4005b384 in epoll_wait () from libc.so
#2  0x40120eaa in ?? ()

2 番目の呼び出しは - 間違いなく - ALooper_pollAlllibc を呼び出すネイティブ コードepoll_waitです。しかし、 に到達する参照はありませんandroid_main

コードは完璧です。cを押して、クラッシュすることなく何時間も実行できますが、停止してバックトレースを出力すると、いつでも同じ 2 行が返されます。

すべての助けと提案に深く感謝します。私たちの製品でいくつかの問題が発生しました..まあ、私たちが今考えることができる唯一の手段は本当に中世です.

4

1 に答える 1

0

さらにいくつかの調査を行った後、私たちは物事を理解しました。場合によっては、バックトレースに 20 以上のレベルがあったこともあれば、ほぼ完全になくなったこともありました。その理由は、ネイティブ プログラミングに使用される Android ライブラリは、通常、デバッグ シンボルから削除されて最適化されるため、システムは、私たちのコードやあなたのコードを指している以上の詳細を提供できないためです。

とはいえ、実際のデバイスでネイティブ コードをデバッグすることは、多くの場合ほぼ不可能です...

于 2012-04-01T16:17:26.597 に答える