在Android应用开发过程中,经过会出现异常情况,哗啦哗啦打印出一堆栈信息,里面虽然包含了出现异常的地址,但是,使用arm-linux-objdump命令把动态库反编译出来,却找不到对应的地址。事实上,单独使用NDK开发的JNI动态库是无法使用dump命令反编译出真实地址的,因为它的地址是由系统动态分配的,如果要打印出来的栈信息反应真实的地址,需要把代码放入android SDK中一起联编译,并且要给该库指定一个地址空间。现在可以尝试以下方法:
打开android-2.0/build/core/prelink-linux-arm.map,该文件给大部分的库都指定了地址,包括线程栈、数据段、文本段、堆、Prelinked系统库、Prelinked应用程序库、Non-Prelinked库的地址空间,并预留了足够的空间(这真是有点麻烦,这空间不知道该怎么分配好,给多了可能浪费,给少了可能出错!),当你添加一个新的库时,注意,要找到该文件中尚未使用的地址空间,把这段空间分配给你新的库。
打开prelink-linux-arm.map文件中,其中有:
libomx_wmadec_sharedlibrary.so 0x66800000
# Sigma Designs libraries
libcore.so 0x61400000
其中,这两个地址之间的空间比较大,所以,可以在0x66800000~0x61400000(好像是地址自减栈??!)地址之间分配。
最后,最后,把代码和库放入android-2.0/external目录下,全部编译打包更新系统,这样,在应用出现异常中止的话,可以根据栈信息和动态库反编译文件找到出现异常的代码。
Tags:
prelink-linux-arm.map解析,prelink-linux-mips.map解析,prelink-linux-arm.map使用方法,Android应用异常调试方法,栈跟踪StackTrack
本文介绍了一种在Android应用开发中解决异常调试难题的方法。通过在prelink-linux-arm.map文件中为新库分配特定地址空间,使得动态库反编译后的栈信息能够映射到实际代码位置,便于开发者定位问题。
1849

被折叠的 条评论
为什么被折叠?



