2012-02-29 2 views
0

내 응용 프로그램에서 네이티브 크래시를 찾고 있지만이 라이브러리의 함수 이름으로 주소를 변환하는 데 도움이되는 도구를 찾을 수 없습니다.이 게시물을 보았습니다. 지난 3 개 라인에서 볼 수안드로이드에서 스택 추적 C++ 함수 이름을 얻는 방법

I/DEBUG ( 31): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 
I/DEBUG ( 31): Build fingerprint: 'generic/sdk/generic:2.3/GRH55/79397:eng/test-keys' 
I/DEBUG ( 31): pid: 378, tid: 386 >>> com.example.gltest <<< 
I/DEBUG ( 31): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000 
I/DEBUG ( 31): r0 001dbdc0 r1 00000001 r2 00000000 r3 00000000 
I/DEBUG ( 31): r4 00000000 r5 40a40000 r6 4051a480 r7 42ddbee8 
I/DEBUG ( 31): r8 43661b24 r9 42ddbed0 10 42ddbebc fp 41e462d8 
I/DEBUG ( 31): ip 00000001 sp 436619d0 lr 83a12f5d pc 8383deb4 cpsr 20000010 
I/DEBUG ( 31):   #00 pc 0003deb4 /data/data/com.example.gltest/lib/libnativemaprender.so 
I/DEBUG ( 31):   #01 pc 00039b76 /data/data/com.example.gltest/lib/libnativemaprender.so 
I/DEBUG ( 31):   #02 pc 00017d34 /system/lib/libdvm.so 

응용 프로그램의 라이브러리가있다 : 당신이이 같은 추적있을 경우에만 작동하는 것 같다

ibnativemaprender.so 만하면 당신의 거기에 나타나는 라이브러리는 addr2line 앱이 작동합니다

,451,515,

하지만 내 추적에서 나는이 있습니다

I/DEBUG (16251):   #00 pc 000161c0 /system/lib/libc.so 
I/DEBUG (16251):   #01 lr afd196f1 /system/lib/libc.so 

을 내 라이브러리 나중에까지가 표시되지 않습니다

/DEBUG (16251): stack: 
I/DEBUG (16251):  46f0c818 afd426a4  
I/DEBUG (16251):  46f0c81c 000b7290  
I/DEBUG (16251):  46f0c820 00000afa  
I/DEBUG (16251):  46f0c824 afd187b9 /system/lib/libc.so  
I/DEBUG (16251):  46f0c828 afd42644  
I/DEBUG (16251):  46f0c82c afd467c4  
I/DEBUG (16251):  46f0c830 00000000  
I/DEBUG (16251):  46f0c834 afd196f1 /system/lib/libc.so 
I/DEBUG (16251):  46f0c838 00000001  
I/DEBUG (16251):  46f0c83c 46f0c86c  
I/DEBUG (16251):  46f0c840 81b6a4a0 /data/data/com.android.ANMP/lib/mylib.so 

그래서 나를 도울 수있는 도구가 있습니까? 또는 addr2line을 사용하는 다른 방법?

답변

1

아니요. 검색을 수동으로 수행해야합니다.

  • 알아 디버그 인쇄 추가 곳과, 당신의 라이브러리를로드 (매우 비싼 도구 인),

  • 사용 IDA 프로 일어날 때 :

    수동은 세 가지 옵션이 있습니다 그것에 주소를 찾고 81b6a4a0, 그것이 어떤 기능인지 알아 내려고 노력하십시오. 디버그 기호를 사용하여 컴파일하는 경우에는 충분히 쉽습니다.

  • 라이브러리의 기본 주소를 찾으려면 objdump (NDK 도구 체인에서)를 사용하여 81b6a4a0 (기본 주소를 제거한 후)에있는 주소를 찾으십시오. 당신이 도움이 아무것도 찾을 ADB를 사용하여 장치에서 libdvm.so libc.so 을 끌어와 기능이 나타납니다 무엇인지 찾으려고하지 않는 경우 모두 마지막면에서

, 스택 추적에서 코드에서 해당 함수를 어디에서 호출하는지 확인하십시오.

+0

당신은 무엇을 의미합니까 검색 :

이클립스에서 GDB를 설정하는이 질문을 참조하십시오? – elios264

+0

답안을 수정하겠습니다. – MByD

+0

ndk-stack 도구가 얼마나 유용합니까? – MobileCushion

0

this을 살펴보십시오. 나는 아직 시도 할 시간을 찾지 못했기 때문에 만약 당신이 일하면 당신에게 알릴 것입니다.

0

스택 트레이스를 얻기 위해 GDB를 사용할 수 있습니다. 루팅 된 전화가 있거나 에뮬레이터를 사용하는 경우 코어 덤프를 활성화 할 수 있습니다. 그런 다음 GDB를 사용하여 코어 덤프를 검사 할 수 있습니다. 당신이 정보를 모든 방법의 모든 내가 입력 시간 종료를 인쇄와 같은 의미? 수동으로

android how to use ndk gdb with a pure native executable

관련 문제