最近在跟進一個native crash的問題,偶然發現Android 5.0及其以上的版本源代碼下有批量轉換 Native trace 工具 development/scripts/stack,特此記錄一下.
幫助資訊如下:
usage: ./development/scripts/stack [options] [FILE]
--arch=arm|arm64|mips|mips64|x86|x86_64
the target architecture
FILE should contain a stack trace in it somewhere
the tool will find that and re-print it with
source files and line numbers. If you don't
pass FILE, or if file is -, it reads from
stdin.
其中的FILE檔案主要是當發生native crash 産生的tomestone墓碑檔案,下面就來示範一下具體的使用方法,其中會将所有的tomestone批量trace出來,友善開發者跟蹤錯誤的natve代碼,而不需要使用傳統的addrline2或者ndk-stack一個個的進行查找
[SPRD] [email protected]:~/ssd/xxx/ap/idh.code$ ./development/scripts/stack tombstone_08
Searching for native crashes in tombstone_08
Reading symbols from /home/tangkw/ssd/A50/ap/idh.code/out/target/product/sl8541e_1h10_go/symbols
Revision: '0'
pid: 4630, tid: 4640, name: HeapTaskDaemon >>> com.xxx.daemon <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x3b6e83
r0 003b6e6f r1 00000000 r2 a718e800 r3 00000000
r4 a8472a00 r5 b23b5d80 r6 b23b5d84 r7 a847f400
r8 97df752c r9 97df7520 sl 00000059 fp b2395d20
ip 97df7520 sp 97df7508 lr b210e877 pc b210e88c cpsr 20000030
Using arm toolchain from: /home/tangkw/ssd/A50/ap/idh.code/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/
下面是截取轉換後的一段trace資料,可以非常清晰的看見調用流程,這樣遠比使用addrline2或者ndk-stack來得友善
Searching for native crashes in tombstone_03
Reading symbols from /home/xxx/ssd/xxx/ap/idh.code/out/target/product/sl8541e_1h10_go/symbols
Revision: '0'
pid: 15749, tid: 16250, name: RenderThread >>> com.xxx.daemon <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x8
r0 95876d00 r1 00000008 r2 00000001 r3 00000000
r4 a73a2710 r5 00000002 r6 00000000 r7 95876d00
r8 9627f170 r9 95183528 sl b17cda48 fp 00000000
ip 95876d04 sp 963f1608 lr a1ae9698 pc 00000008 cpsr 60000010
Using arm toolchain from: /home/tangkw/ssd/A50/ap/idh.code/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/
Stack Trace:
RELADDR FUNCTION FILE:LINE
00000008 <unknown>
00638694 egl_winsys_get_implementation+7500 /vendor/lib/egl/libGLES_mali.so
00637684 egl_winsys_get_implementation+3388 /vendor/lib/egl/libGLES_mali.so
00311a30 eglGetCurrentDisplay+436 /vendor/lib/egl/libGLES_mali.so
003118e4 eglGetCurrentDisplay+104 /vendor/lib/egl/libGLES_mali.so
0030e984 eglQuerySurface+1324 /vendor/lib/egl/libGLES_mali.so
0000bd99 eglQuerySurface+104 frameworks/native/opengl/libs/EGL/eglApi.cpp:857
v------> android::uirenderer::renderthread::EglManager::queryBufferAge(void*) frameworks/base/libs/hwui/renderthread/EglManager.cpp:417
0004dc2b android::uirenderer::renderthread::EglManager::beginFrame(void*)+82 frameworks/base/libs/hwui/renderthread/EglManager.cpp:431
0004b5cd android::uirenderer::renderthread::OpenGLPipeline::getFrame()+8 frameworks/base/libs/hwui/renderthread/OpenGLPipeline.cpp:55
00049feb android::uirenderer::renderthread::CanvasContext::draw()+58 frameworks/base/libs/hwui/renderthread/CanvasContext.cpp:429
0004cc85 android::uirenderer::renderthread::DrawFrameTask::run()+140 frameworks/base/libs/hwui/renderthread/DrawFrameTask.cpp:105
00051cef android::uirenderer::renderthread::RenderThread::threadLoop()+178 frameworks/base/libs/hwui/renderthread/RenderThread.cpp:375
0000d2c5 android::Thread::_threadLoop(void*)+144 system/core/libutils/Threads.cpp:744
0006e295 android::AndroidRuntime::javaThreadShell(void*)+80 frameworks/base/core/jni/AndroidRuntime.cpp:1239
00046f93 __pthread_start(void*)+22 bionic/libc/bionic/pthread_create.cpp:226
0001a2a7 __start_thread+32 bionic/libc/bionic/clone.cpp:47