gpt4 book ai didi

android - 调试应用程序段错误?编译器的错?

转载 作者:行者123 更新时间:2023-11-29 22:07:40 25 4
gpt4 key购买 nike

我目前正在为 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 安装它。我删除了 out/目录并完全重建了 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. 须藤 ldconfig
  3. 重启我的机器
  4. 我考虑删除 gcc-4.6,以便在我的机器上只获得 gcc-4.5。但是突触显示需要卸载太多依赖项,我没有迈出那一步:)

最后我被告知安装 gcc-4.5-multilib 和 g++-4.5-multilib。它奏效了,并且构建更进一步。我启动了 panda,应用程序(例如 com.android.launcher)仍然无法启动。我知道这是一个假设,但我认为这个段错误与编译器有某种联系。

我的问题很简单:

  1. com.android.launcher 是交叉编译的还是用host 32bit编译的编译器?我应该寻找什么关键字才能在构建日志中找到关联的命令?
  2. 如何调试这个段错误?特别是,我正在寻找用于使用“am”命令启动 com.android.launcher。
  3. strace 会为这个问题提供有值(value)的信息吗?

非常感谢。

最佳答案

使用gdb。要求:

#是目标 shell,虽然 root 不是强制性的
$是主机外壳

  1. 应用程序必须在 Debug模式下编译
    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>

如果您遇到 gdbclient 问题, 检查 build/envsetup.sh定义函数的位置:
$ type gdbclient
添加冗长的 -v选项可能会有所帮助。此外,如果您的可执行文件不在 system/bin 中, 你肯定需要修改 build/envsetup.sh因为它是硬编码的。

可以找到更多信息here .

关于android - 调试应用程序段错误?编译器的错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10422681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com