本机Android GDB远程调试收到信号

本机Android GDB远程调试收到信号,android,native,remote-debugging,Android,Native,Remote Debugging,软件:TI android官方发布源代码包,适用于AM335x的Jelly bean 4.2.2,是的,arago/rowboat/TI开发人员对vanilla aosp进行了修改,但与我的问题无关 硬件:基于AM335x Cortex A8 SOC的am335xevm_sk TI开发硬件 我所做的: 构建系统并使用sd卡引导硬件。一切正常 adb提取init.am335xevm.rc文件,注释掉rild服务并将其推回,重新启动目标系统。我这样做是因为我想使用交叉调试器来远程调试rild 设置远

软件:TI android官方发布源代码包,适用于AM335x的Jelly bean 4.2.2,是的,arago/rowboat/TI开发人员对vanilla aosp进行了修改,但与我的问题无关

硬件:基于AM335x Cortex A8 SOC的am335xevm_sk TI开发硬件

我所做的:

构建系统并使用sd卡引导硬件。一切正常

adb提取init.am335xevm.rc文件,注释掉rild服务并将其推回,重新启动目标系统。我这样做是因为我想使用交叉调试器来远程调试rild

设置远程调试:adb转发tcp端口。并在目标系统上启动gdbserver,如下所示:

root@android:/ # gdbserver localhost:2345 system/bin/rild
Process system/bin/rild created; pid = 829
Listening on port 2345
Remote debugging from host 127.0.0.1
远程调试rild,如下所示:

ma@ma-aspire:~/devkit/JB422$ PATH=$PATH:/home/ma/devkit/JB422/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin
ma@ma-aspire:~/devkit/JB422$ arm-linux-androideabi-gdb
GNU gdb (GDB) 7.3.1-gg2
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=x86_64-linux-gnu --target=arm-linux-android".
For bug reporting instructions, please see:
<xxxx://www.gnu.org/software/gdb/bugs/>. 
(gdb) file /home/ma/devkit/JB422/out/target/product/am335xevm_sk/symbols/system/bin/rild 
Reading symbols from /home/ma/devkit/JB422/out/target/product/am335xevm_sk/symbols/system/bin/rild...done.
(gdb) set sysroot /home/ma/devkit/JB422/out/target/product/am335xevm_sk/symbols
(gdb) target remote localhost:2345
Remote debugging using localhost:2345
__dl__start () at bionic/linker/arch/arm/begin.S:35
35 mov r0, sp
(gdb) n
36 mov r1, #0
(gdb) n
37 bl __linker_init
(gdb) n

Program received signal SIGILL, Illegal instruction.
0x4013a89e in __linker_init (elfdata=0xbee7bae0) at bionic/linker/linker.cpp:2030
2030 extern "C" unsigned __linker_init(unsigned **elfdata) {
(gdb) c
Continuing.

Program terminated with signal SIGILL, Illegal instruction.
The program no longer exists.
(gdb)
~~~~~~~~~~~~~~~~~~~~~~~~~~~

我对低级工具链问题不是很熟悉。我用谷歌搜索了这个问题,似乎很少有人遇到同样的问题

我下载了aosp源程序Android 4.2.2_r1、JDQ39,并比较了预构建的工具链和NDK内容,没有发现显著差异

我还尝试了最新的NDK r10b。使用NDK中的预构建工具链重建整个目标系统并进行调试,结果相同

我还尝试生成平台设置为android-17和android-18的独立工具链,并重复上述步骤,结果相同

我还尝试重新构建NDK工具链,结果没有什么不同

我还尝试了NDK r10b包中较新版本的gdbserver预构建,但问题仍然存在

~~~~~~~~~~~~~~~~~~~~~~~~~~~

但如果我使用NDK工具链调试一个简单的hello world程序,并动态链接liblog,如本页所述:

www.dot srombauts dot fr/2011/03/06/standalone toolchain/

进行调试时,我可以进入main,但在程序退出后,目标系统上的进程得到了类似的SIGILL终止,而不是正常退出

~~~~~~~~~~~~~~~~~~~~~~~~~~~

我很困惑为什么会出现这种情况,因为许多开发人员使用gdb调试本机代码,而谷歌的平台开发人员也应该严重依赖gdb调试。问题似乎不太可能是由gdb或gdbserver中的错误引起的。也许它与am335x内核相关并特定于am335x内核?或者我错过了使用gdb的重要内容?比如说,目标架构选项?或者应该为这种本机调试指定某些编译器选项?我仔细阅读了很多关于android上本机远程调试的在线文章,没有发现任何特别指出的内容


我真的很想使用远程GDB调试一些本机程序,包括ril和其他一些包装HAL LIB的测试用例。请帮忙

很抱歉,这不是答案,而是对我先前问题的补充

我进一步挖掘了这个问题

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我在android源代码树中放了一个基本的helloworld程序:

#include <stdio.h>
#include <android/log.h>

#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "hello-native", __VA_ARGS__))

void main(void)
{
    printf("Hello Native Printf\n");
    LOGI("Hello Native LOGI");
}
然后,如前一篇文章中所述,SIGILL的调试失败

但如果我使用Karim Yaghmour在其优秀著作《嵌入式Android》第140页中提出的标准Makefile:

#Paths and settings

TARGET_PRODUCT = am335xevm_sk
ANDROID_ROOT = /home/ma/devkit/JB422
BIONIC_LIBC = $(ANDROID_ROOT)/bionic/libc
PRODUCT_OUT = $(ANDROID_ROOT)/out/target/product/$(TARGET_PRODUCT)
CROSS_COMPILE = $(ANDROID_ROOT)/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/arm-linux-androideabi-

# Tool names
AS = $(CROSS_COMPILE)as
AR = $(CROSS_COMPILE)ar
CC = $(CROSS_COMPILE)gcc
CPP = $(CC) -E
LD = $(CROSS_COMPILE)ld
NM = $(CROSS_COMPILE)nm
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
RANLIB = $(CROSS_COMPILE)ranlib
READELF = $(CROSS_COMPILE)readelf
SIZE = $(CROSS_COMPILE)size
STRINGS = $(CROSS_COMPILE)strings
STRIP = $(CROSS_COMPILE)strip

export AS AR CC CPP LD NM OBJCOPY OBJDUMP RANLIB READELF \
SIZE STRINGS STRIP

# Build settings

CFLAGS = -O0 -Wall -fno-short-enums -ggdb

HEADER_OPS = -I$(BIONIC_LIBC)/include \
-I$(BIONIC_LIBC)/arch-arm/include \
-I$(BIONIC_LIBC)/kernel/common \
-I$(BIONIC_LIBC)/kernel/arch-arm \
-I$(ANDROID_ROOT)/system/core/include

LDFLAGS = -nostdlib -Wl,-dynamic-linker,/system/bin/linker \
$(PRODUCT_OUT)/obj/lib/crtbegin_dynamic.o \
$(PRODUCT_OUT)/obj/lib/crtend_android.o \
-L$(PRODUCT_OUT)/obj/lib -lc -ldl -llog

# Installation variables
EXEC_NAME = hello-native
INSTALL = install
INSTALL_DIR = $(PRODUCT_OUT)/system/bin

# Files needed for the build
OBJS = hello-native.o

# Make rules
all: hello-native

.c.o:
$(CC) $(CFLAGS) $(HEADER_OPS) -c $<

hello-native: ${OBJS}
$(CC) -o $(EXEC_NAME) ${OBJS} $(LDFLAGS)

install: hello-native
test -d $(INSTALL_DIR) || $(INSTALL) -d -m 755 $(INSTALL_DIR)
$(INSTALL) -m 755 $(EXEC_NAME) $(INSTALL_DIR)

clean:
rm -f *.o $(EXEC_NAME) core
distclean:
rm -f *~
rm -f *.o $(EXEC_NAME) core
然后,如果我没有将sysroot设置为out/target/product/am335xevm_sk/symbols,那么程序将正确编译和调试,否则,调试器可能会进入链接器并与前面提到的SIGILL一起崩溃

这至少为我的需要提供了一个变通解决方案,但我不能相信Android ndk gdb不能处理拇指代码?gcc/gdb设置有什么我遗漏的吗?或者在Rowboat发行版中修改了一些gcc选项,使官方gdb工具无法正常工作


救命啊

大家好,我不是专家,但我建议创建一个简单的示例android应用程序,导入一些本机代码,将一些本机代码编译到库中,然后从Java加载,然后使用ndk gdb命令进行调试,以了解ndk gdb的功能。它将solib路径设置为包含本机库的路径,但也会从设备中提取一些库并将它们添加到solib路径。我只有在开始使用ndk gdb进行调试,当然还有使用adb root进行调试时,我的调试才能正常工作,并且没有SIGILL的调试
#Paths and settings

TARGET_PRODUCT = am335xevm_sk
ANDROID_ROOT = /home/ma/devkit/JB422
BIONIC_LIBC = $(ANDROID_ROOT)/bionic/libc
PRODUCT_OUT = $(ANDROID_ROOT)/out/target/product/$(TARGET_PRODUCT)
CROSS_COMPILE = $(ANDROID_ROOT)/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/arm-linux-androideabi-

# Tool names
AS = $(CROSS_COMPILE)as
AR = $(CROSS_COMPILE)ar
CC = $(CROSS_COMPILE)gcc
CPP = $(CC) -E
LD = $(CROSS_COMPILE)ld
NM = $(CROSS_COMPILE)nm
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
RANLIB = $(CROSS_COMPILE)ranlib
READELF = $(CROSS_COMPILE)readelf
SIZE = $(CROSS_COMPILE)size
STRINGS = $(CROSS_COMPILE)strings
STRIP = $(CROSS_COMPILE)strip

export AS AR CC CPP LD NM OBJCOPY OBJDUMP RANLIB READELF \
SIZE STRINGS STRIP

# Build settings

CFLAGS = -O0 -Wall -fno-short-enums -ggdb

HEADER_OPS = -I$(BIONIC_LIBC)/include \
-I$(BIONIC_LIBC)/arch-arm/include \
-I$(BIONIC_LIBC)/kernel/common \
-I$(BIONIC_LIBC)/kernel/arch-arm \
-I$(ANDROID_ROOT)/system/core/include

LDFLAGS = -nostdlib -Wl,-dynamic-linker,/system/bin/linker \
$(PRODUCT_OUT)/obj/lib/crtbegin_dynamic.o \
$(PRODUCT_OUT)/obj/lib/crtend_android.o \
-L$(PRODUCT_OUT)/obj/lib -lc -ldl -llog

# Installation variables
EXEC_NAME = hello-native
INSTALL = install
INSTALL_DIR = $(PRODUCT_OUT)/system/bin

# Files needed for the build
OBJS = hello-native.o

# Make rules
all: hello-native

.c.o:
$(CC) $(CFLAGS) $(HEADER_OPS) -c $<

hello-native: ${OBJS}
$(CC) -o $(EXEC_NAME) ${OBJS} $(LDFLAGS)

install: hello-native
test -d $(INSTALL_DIR) || $(INSTALL) -d -m 755 $(INSTALL_DIR)
$(INSTALL) -m 755 $(EXEC_NAME) $(INSTALL_DIR)

clean:
rm -f *.o $(EXEC_NAME) core
distclean:
rm -f *~
rm -f *.o $(EXEC_NAME) core
ifeq ($(TARGET_ARCH),arm)

LOCAL_SHARED_LIBRARIES += libdl
endif # arm

LOCAL_CFLAGS := -DRIL_SHLIB -O0
LOCAL_ARM_MODE := arm

LOCAL_MODULE:= rild
LOCAL_MODULE_TAGS := optional

include $(BUILD_EXECUTABLE)