2014-10-10 2 views
1
소프트웨어

SIGILL에게있어 .)기본 안드로이드 GDB 원격 디버그

하드웨어 : AM335x 코어 텍스 A8 SOC 기반으로 am335xevm_sk (TI의 dev에 booard)

내가 무엇 :

  1. 하드웨어를 부팅 SD 카드를 사용하여 시스템을 구축 할 수 있습니다. 모든 것이 제대로 작동합니다.

  2. ADB는 init.am335xevm.rc 파일을 끌어 rild 서비스를 주석으로 다시 밀어, 대상 시스템을 다시 부팅합니다. 원격 디버그 rild에 크로스 디버거를 사용하기 때문에이 작업을 수행합니다.

  3. 원격 디버그 설정 : adb 전달 TCP 포트. ~~~~~~~~~~~~~~~~~

    [email protected]:~/devkit/JB422$ PATH=$PATH:/home/ma/devkit/JB422/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin 
    [email protected]:~/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) 
    

:로,

[email protected]:/ # 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 :와 같이 대상 시스템에서 gdbserver 시작 ~~~~~~~~~~

    나는 낮은 수준의 툴체인 문제에 익숙하지 않다. 나는 그 문제를 봤는데, 거의 같은 사람들이 같은 문제를 겪은 것으로 보인다.

    내가 AOSP 소스 (안드로이드 4.2.2_r1, JDQ39)과 비교 미리 만들어진 툴체인과 NDK 컨텐츠를 다운로드, 통계적으로 유의 한 차이가 발견되지 않았다.

    또한 최신 NDK (r10b)로 시도했습니다. NDK에서 미리 만들어진 툴체인을 사용하여 전체 대상 시스템을 재구성하고 디버그를 수행하면 결과가 동일합니다.

    I는 또한 안드로이드 17 안드로이드 18로 설정 플랫폼 독립형 툴 체인을 생성하고, 상기 단계를 반복하려 결과는 동일하다.

    또한 NDK 도구 체인을 다시 작성하려고 시도했지만 아무런 차이가 없었습니다.

    는 또한 (NDK의 r10b 패키지 prebuilts) 새로운 gdbserver의 버전을 시도하고, 문제가 계속.

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

    하지만 간단한 인사 세계 프로그램을 디버깅하기 위해 NDK 툴체인을 사용하는 경우 (liblog 동적 링크와 함께),이 페이지에서 제안으로 :

    WWW 도트 srombauts는 점 FR/2011/03/06/독립형 - 툴체인/

    및 디버그, 내가) (주로 단계 수를 할

    , 그러나 프로그램 종료 후에, 목표 시스템의 프로세스는 정상적인 종료 대신 SIGILL 종료와 비슷한 결과를 얻습니다. 많은 많은 개발자가 GDB를 사용하기 때문에 ~~~~~~~~~~~~~~~~~~~~~~~~~~~

    나는,이 발생하는 이유를 매우 혼란 스러워요 디버그 네이티브 코드와 구글의 플랫폼 개발자도 gdb 디버그에 의존해야합니다. gdb 또는 gdbserver의 버그로 인해 문제가 발생하지는 않습니다.아마 am335x 커널과 관련이 있을까요? 아니면 gdb를 사용하기 위해 중요한 것을 놓쳤는가? 타겟 아키텍처 옵션? 또는 특정 컴파일러 옵션을 이런 종류의 네이티브 디버그에 지정해야합니까? 신중하게 안드로이드에서 원거리 원격 디버그에 대한 온라인 기사를 읽었으며 특별히 지적하고있는 것을 발견하지 못했습니다.

    원격 GDB를 사용하여 ril 및 HAL 라이브러리를 래핑하는 다른 테스트 사례를 포함한 일부 원시 프로그램을 디버깅하고 싶습니다. 도와주세요!

  • 답변

    0

    죄송합니다. 이것은 답변이 아니며 이전 질문에 대한 보충 설명입니다.

    나는 더 이상 문제를 파헤 쳤다.

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 나는 기본적인 helloworld를 프로그램을 넣어

    이전 포스트에서 언급 한 바와 같이

    LOCAL_PATH:= $(call my-dir) 
    
    include $(CLEAR_VARS) 
    
    LOCAL_MODULE := hello-native 
    LOCAL_MODULE_TAGS := optional 
    LOCAL_SRC_FILES := hello-native.c 
    
    LOCAL_SHARED_LIBRARIES := liblog 
    
    include $(BUILD_EXECUTABLE) 
    

    그런 다음 디버그가 SIGILL와 함께 실패로 Android.mk 파일로

    #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"); 
    } 
    

    : 안드로이드 소스 트리의 내부.

    하지만 (안드로이드 임베디드 그의 훌륭한 책, 140 페이지에 카림 Yaghmour에 의해 제안 등) 표준 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로 설정하면 프로그램이 종료되고 디버거 sysroot를 설정하지 않으면 프로그램이 정상적으로 종료됩니다.

    그들은 다른 툴체인과 디버거, 원래의 TI 릴리즈에서 원래 나 새 버전의 NDK 또는 NDK의 소스 코드에서 다시 작성한 것과 동일한 방식으로 작동합니다.

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

    그럼 난 시도 내가 SYSROOT 밖으로/대상/제품/am335xevm_sk/기호를, 그렇지 않으면를 설정하지 않으면

    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) 
    

    그런 프로그램이 올바르게 컴파일 및 디버깅 :로, 팔 설정 LOCAL_ARM_MODE로, ARM 코드에서 rild를 컴파일 디버거는 앞서 언급 한 것처럼 SIGILL을 사용하여 링커로 들어가고 충돌 할 수 있습니다.

    적어도 내 필요에 대한 해결책을 제공하지만 안드로이드 (ndk) gdb가 엄지 코드를 처리 할 수 ​​없다고 생각하지 않습니까? gcc/gdb 설정에 대해 놓친 것이 있습니까? 또는 공식 gdb 도구가 제대로 작동하지 못하게하는 일부 gcc 옵션이 Rowboat 배포판에서 수정 되었습니까?

    HELP!

    +0

    안녕하세요. 전문가는 아니지만 어떤 원시 코드를 가져 와서 (라이브러리에 원시 코드를 컴파일 한 다음 Java에서로드하는) 간단한 예제 Android 패키지를 만든 다음 ndk-gdb 명령을 사용하여 디버그하는 것이 좋습니다. , ndk-gdb가하는 것을보기 위해서. 그것은 솔브 경로를 네이티브 라이브러리를 포함하는 경로로 설정하지만 장치에서 일부 라이브러리를 가져 와서 solib 경로에 추가합니다. 나는 디버그가 작동하고 SIGILL이 없으면 ndk-gdb로 디버깅을 시작했다 (물론 adb 루트를 사용한다) – Colin

    관련 문제