2012-09-07 3 views
2

Android (Java/C/C++)에서 혼합 된 코드를 디버깅하려고합니다. 내 대상 장치는 Vizio 1008입니다. 코드는 에뮬레이터에서 실행되며 GDB를 사용하여 Eclipse에서 디버깅 할 수 있습니다. 그러나 실제 장치에서는이 작업을 수행 할 수 없습니다. GDBSERVER은 (성공적으로) 장치에 시작되면GDBSERVER가 시작시 종료됩니다.

, 즉시 메시지와 함께 종료 : "알 수없는 레지스터 D0 요청"

이 고민의 일 후에 나는 문제를 지역화. 따라서 디버깅 세션이 가능하지 않습니다. 또한 ARM에서 DS-5 디버거를 사용해 보았습니다. GDBSERVER는 연결 상태를 유지하지만 원격 디버거에서 연결 시도를 종료합니다. GDBSERVER 디버그 출력을 시도했지만 유용한 정보를 제공하지 않습니다.

더 이상하게도 나는 얻을 수있는 GDBSERVER의 모든 버전을 사용해 보았습니다. 모든 버전이 이와 같이 작동합니다. 그러나 Google NDK의 이전 버전 (3 또는 4 버전)에서 GDBSERVER를 발견했습니다. 그리고이 버전이 작동합니다 !!! 하지만 디버거 (호스트)가 곧 (세그먼테이션 오류) 죽으면, 심지어 그 프로그램이 괜찮다는 것을 알게됩니다.

GDBSERVER 소스 코드를 살펴본 결과,이 오류는 GDBSERVER가 하드웨어를 검사 할 때의 시작 시퀀스와 관련이 있습니다. 아마도, 그것은 부동 소수점 코 프로세서에 관한 것이지만,이 오류 메시지는 꽤 일반적인 것이므로 잘 모르겠습니다.

중요한 점은 Google NDK를 사용하여 Windows에서 devloping하는 것입니다. 이 코드는 자바 셸과 Java로 구현 된 몇 가지 기능 (스레드 된 HTTP 호출)을 사용하는 99 % C/C++입니다. 다시, 응용 프로그램은 장치에서 작동하며 에뮬레이터에서 (Java 및 C/C++ 모두) 디버깅 할 수 있습니다. 또한 장치에서 Java 부분을 디버그 할 수 있습니다.

어떤 사람이 무엇인지 알 수 있습니까? 그리고 그것을 고치는 방법? 비지오인가요?

미리 감사드립니다.

답변

2

네이티브 디버깅을 시도하는 중에 발생하는 문제와 유사합니다. 문제는 장치에 사용 된 암 프로세서가 iwmmx 명령 세트와 vfp/neon 명령 세트를 모두 지원했기 때문에 gdbserver는 두 개가 상호 배타적이라고 가정합니다. 불행히도 gdbserver 소스를 엉망으로 만들 필요가 있습니다. 다음은 link의 수정 사항입니다. 당신은 gdbserver 소스 트리에서 파일 리눅스 - 팔 low.c을 편집해야합니다 :

static void 
arm_arch_setup (void) 
{ 
    arm_hwcap = 0; 
    if (arm_get_hwcap (&arm_hwcap) == 0) 
    { 
    init_registers_arm(); 
    return; 
    } 

/* gdbserver assumes that only one of VFP or IWMMXT is available, which may 
not be true. In that case, gdbserver fails at run-time with "Unknown 
register d0 requested". For now, pretend IWMMXT is missing when both are 
available. */ 
if ((arm_hwcap & HWCAP_VFP) && (arm_hwcap & HWCAP_IWMMXT)) 
    arm_hwcap &= ~HWCAP_IWMMXT; 

당신이 코드는 비록 GDB (서버) 버전에 따라 변경해야 할 곳의 정확한 위치. 사실 gdb 7.7의 경우 약간 다릅니다. 이 방법을 변경 한 후에는 GNU에서 gcc로 빌드해야하므로 생체 공학과 물건에 연결됩니다. 나는 그것을 직접하지 않았기 때문에 그것에 대한 정확한 지침이 없다. 이것이 궁극적으로 적절한 해결 방법보다 더 많은 해결 방법이라고 강조해야합니다. 실제로 iwmmx 명령어가 포함 된 코드를 실행할 때 gdbserver가이 방식으로 패치 한 방법을 모릅니다. 최소한 iwmmx 레지스터의 레지스터 덤프는 얻을 수 없을 것입니다.

관련 문제