调试应用程序分段错误?编译器的错?
Posted
技术标签:
【中文标题】调试应用程序分段错误?编译器的错?【英文标题】:Debug app segmentation fault? Compiler's fault? 【发布时间】:2012-05-02 22:37:13 【问题描述】:我目前正在为 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 位版本。到目前为止,这是我尝试过的事情,但没有成功:
-
按照these instructions重新安装包
sudo ldconfig
重启我的机器
我考虑删除 gcc-4.6 以便在我的机器上只获得 gcc-4.5。
但是突触显示需要卸载很多依赖项,
我没有迈出那一步:)
最后有人告诉我安装 gcc-4.5-multilib 和 g++-4.5-multilib。它奏效了,并且构建更进一步。我启动了熊猫,但应用程序(例如 com.android.launcher)仍然无法启动。我知道这是一个假设,但我认为这个段错误与编译器有关。
我的问题很简单:
-
com.android.launcher 是交叉编译还是与host 32bit 一起编译
编译器?我应该寻找什么关键字来在构建日志中找到相关的命令?
如何调试此分段错误?特别是,我正在寻找
用于使用“am”命令启动 com.android.launcher。
strace 会为此问题提供有价值的信息吗?
谢谢大家。
【问题讨论】:
tl;dr 但一些快速帮助:strace
可能会给您一个粗略的指示,告诉您什么时候崩溃。 gdb
可以给出更精确的指示,但您需要:1) 有一个工作的 gdb
,2) 使用 -ggdb
构建崩溃的二进制文件(或库?),3) 知道如何使用 gdb
。
我使用了几次 strace,但不记得它是否可以帮助解决段错误。 gdb 在 android 上很容易启动,几个月前我彻底使用了它(在 ARM 上的非 android linux 上),但我追逐的 bug 不是 segfaults :)。所以我现在就在十字路口前……我知道-g但不知道-ggdb,谢谢!
【参考方案1】:
使用 gdb。要求:
#
是目标 shell,虽然不是必须的 root $
是主机 shell
-
应用程序必须在调试模式下编译
LOCAL_CFLAGS += -g
在目标上启动 gdbserver:# gdbserver :5039 </system/bin/executable>
(或)# gdbserver :5039 --attach <pid>
将 tcp 端口转发到 adb 连接:$ adb forward tcp:5039 tcp:5039
在主机上启动gdbclient:$ gdbclient :5039 <executable>
如果您遇到gdbclient
,请检查定义函数的build/envsetup.sh
:$ type gdbclient
添加详细的-v
选项可能会有所帮助。此外,如果您的可执行文件不在system/bin
中,您肯定需要修改build/envsetup.sh
,因为它是硬编码的。
更多信息可以在here找到。
【讨论】:
链接失效 @martinkunev 已修复以上是关于调试应用程序分段错误?编译器的错?的主要内容,如果未能解决你的问题,请参考以下文章