最近在跟进一个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] tangkw@Ubuntu16-Model:~/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