2012-05-02 6 views
1

私は現在、pandaboardのAndroid Linaroビルド11.11(ステージング - パンダ)をコンパイルしています。アプリの分割エラーをデバッグしますか?コンパイラの不具合?

ビルドプロセスでは、Androidはいくつかのツールをホストgccコンパイラでコンパイルします。私のLinux Mint 12(Ubuntu-11.10ベース)では、デフォルトでgcc-4.6がインストールされています。

私はAndroidを作りましたが、すべてがうまく動作し、pandaboardが起動しましたが、アプリケーションを起動するとセグメント違反(logcatのシグナル11)につながります。

私は、リナロが4.6バージョンではなくgcc-4.5でこのリリースを構築したことを知りました。私はapt-getを使ってインストールしました。私は/ディレクトリを削除し、Androidを完全に再構築しました。

コンパイルは正常に動作しますが、リンカが私を侮辱:

g++-4.5 -Wl,-rpath-link=out/target/product/pandaboard/obj/lib -Wl,-rpath,\$ORIGIN/../lib -Lout/host/linux-x86/obj/lib -Wl,--no-undefined -m32   out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp.o  -Wl,--whole-archive -Wl,--no-whole-archive out/host/linux-x86/obj/STATIC_LIBRARIES/libhost_intermediates/libhost.a -o out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp 
g++-4.5 -Wl,-rpath-link=out/target/product/pandaboard/obj/lib -Wl,-rpath,\$ORIGIN/../lib -Lout/host/linux-x86/obj/lib -Wl,--no-undefined -m32   out/host/linux-x86/obj/EXECUTABLES/mkbootfs_intermediates/mkbootfs.o  -Wl,--whole-archive -Wl,--no-whole-archive  -o out/host/linux-x86/obj/EXECUTABLES/mkbootfs_intermediates/mkbootfs 
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.5.4/libstdc++.so when searching for -lstdc++ 
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.5.4/libstdc++.a when searching for -lstdc++ 
/usr/bin/ld: cannot find -lstdc++ 
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.5.4/libgcc_s.so when searching for -lgcc_s 
/usr/bin/ld: cannot find -lgcc_s 
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.5.4/libgcc.a when searching for -lgcc 
/usr/bin/ld: cannot find -lgcc 
collect2: ld returned 1 exit status 

リンカは32bit版のため、おそらくそれが、GCC-4.5の64ビットライブラリをつかみます。これまでのところ、ここで私が試した事が成功せず、以下のとおりです。

  1. 再実行し、次のパッケージのインストールをthese instructions
  2. はsudo ldconfigを
  3. 私のマシンは
  4. 私はGCC-4.6を取得するために削除するに見えた
  5. リブート私のマシンではgcc-4.5のみです。 4.5-multilibの - しかし、シナプスは、私はそのステップをしなかったアンインストールするために必要な非常に多くの依存関係、 :)

は、最後に私は、GCC-4.5-multilibのとg ++をインストールすると言われてきた示しました。それは働き、ビルドはさらに進んだ。私はパンダを始めるが、まだアプリケーション(例えばcom.android.launcher)は起動に失敗する。私はこれが前提だと知っていますが、私はこのセグメンテーションが何とかコンパイラにリンクされていると思います。

私の質問は単純です:

  1. は、クロスコンパイルまたはホスト32ビット コンパイラでコンパイルcom.android.launcherですか?ビルドログに関連するコマンドを見つけるためにどのようなキーワードを探す必要がありますか?
  2. このセグメンテーションフォルトをどのようにデバッグできますか?特に、私は "am"コマンドでcom.android.launcherを起動するために を探しています。
  3. straceはこの問題の重要な情報を提供しますか?

ありがとうございました。

+0

* tl; dr *しかし、いくつかのクイックヘルプ: 'strace'は、物事がどんな点でクラッシュするかを大まかに示すかもしれません。 'gdb'ははるかに正確な表示を与えることができますが、あなたは' 'gdb''を稼働させること、' '-ggdb''を使ってクラッシュするバイナリ(またはライブラリ?)を構築すること、' 'gdb'を使う方法。 – mvds

+0

私はstraceを数回使用しましたが、segfaultに役立つかどうか覚えていません。 gdbはアンドロイドで始めるのはかなり簡単です。私は数ヶ月前に(ARMでは非アンドロイドのLinux上で)徹底的に使っていましたが、私が追跡していたバグはsegfaultsではありません:)。だから今私は十字路の前にいる...私は-gを知っていたが、-ggdbについては知らなかった、ありがとう! –

答えて

1

gdb。要件:ルートであることが
$必須ではありませんが、

#は、ターゲット・シェルでは、アプリがターゲット上でデバッグモードで
LOCAL_CFLAGS += -g

  • 開始gdbserverのをコンパイルする必要があり、ホストシェル

    1. です:
      # gdbserver :5039 </system/bin/executable>
      (または)
      ADB接続へ
    2. 前方のTCPポート:ホスト上の
      $ adb forward tcp:5039 tcp:5039
    3. 開始gdbclient:あなたはgdbclientに苦労した場合
      $ gdbclient :5039 <executable>

    は、build/envsetup.shをチェックする機能が定義されています
    $ type gdbclient
    追加冗長-vオプションが役立つかもしれません。また、実行ファイルがsystem/binにない場合は、ハードコードされているので、build/envsetup.shを必ず変更する必要があります。

    さらに詳しい情報はhereで確認できます。

  • +0

    リンクが壊れています – martinkunev

    +1

    @martinkunev fixed –

    関連する問題