调试app分段错误?编译器的错?

时间:2012-05-02 22:37:14

标签: android gcc segmentation-fault

我目前正在为pandaboard编译Android Linaro build 11.11(staging-panda)。

在构建过程中,Android使用主机gcc编译器编译一些工具。在我的Linux Mint 12(基于Ubuntu-11.10)上,我默认安装了gcc-4.6。

我构建了Android,一切运行正常,pandaboard启动,但随后启动任何应用程序都会导致分段错误(logcat中的信号11)。

然后我了解到Linaro使用gcc-4.5而不是4.6版本构建了此版本。我用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

链接器抓取gcc-4.5的64位库,尽管可能是32位版本。到目前为止,这是我尝试的事情,但没有成功:

  1. these instructions
  2. 之后重新安装软件包
  3. sudo ldconfig
  4. 重启我的机器
  5. 我考虑删除gcc-4.6以在我的机器上只获取gcc-4.5。 但突触显示需要卸载许多依赖项, 我没有迈出这一步:)
  6. 最后我被告知要安装gcc-4.5-multilib和g ++ - 4.5-multilib。它工作,并且构建得更进一步。我启动了熊猫,仍然是应用程序(例如com.android.launcher)无法启动。我知道这是一个假设,但我认为这个段错误与编译器有某种联系。

    我的问题很简单:

    1. com.android.launcher是否与主机32位交叉编译或编译 编译器?我应该在构建日志中查找关联命令的关键字是什么?
    2. 如何调试此分段错误?特别是,我在寻找 使用“am”命令启动com.android.launcher。
    3. strace会为这个问题提供有价值的信息吗?
    4. 谢谢你。

1 个答案:

答案 0 :(得分:2)

使用 gdb 。要求:

#是目标shell,但root不是必需的 $是主机shell

  1. 必须在调试模式下编译应用程序 LOCAL_CFLAGS += -g
  2. 在目标上启动gdbserver:
    # gdbserver :5039 </system/bin/executable>
    (或)
    # gdbserver :5039 --attach <pid>
  3. 将tcp端口转发到adb连接:
    $ adb forward tcp:5039 tcp:5039
  4. 在主机上启动gdbclient:
    $ gdbclient :5039 <executable>
  5. 如果您对gdbclient感到困难,请检查定义该功能的build/envsetup.sh
    $ type gdbclient
    添加详细-v选项可能是一些帮助。此外,如果您的可执行文件不在system/bin中,您肯定需要修改build/envsetup.sh,因为它是硬编码的。

    可以找到更多信息here