2012-02-25 11 views
1

私が何かをもっと言う前に、まずはソフトウェアが完全に正常であることから始めましょう。それはAndroidのサンプルから取られ、クラッシュしません:)。Android NDKのデバッグとバックトレースの疑問符

私のチームは最近、アンドロイドから元気なバックトレースを得るのに苦労しています。私たちは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_pollAll、libcののepoll_waitを呼び出します。 android_mainに達する参照はありません。

コードは完全に良好です。私はcを打つことができ、クラッシュすることなく何時間も稼働させることができますが、いつでもそれを停止し、バックトレースを印刷することはいつでも同じ2行を返します。

すべてのヘルプと提案に感謝します。私達は私達の製品でいくつかの問題に遭遇しました。私たちが今考えている唯一の手段は真に中世のものです。

答えて

0

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

実際のデバイスでのネイティブコードのデバッグは、ほとんど不可能であるとのことです...