如何学习Debug Native Exception?

来源:互联网 发布:网易和暴雪 知乎 编辑:程序博客网 时间:2024/06/05 05:18
如何学习Debug Native Exception?
 

FAQ Content

[DESCRIPTION]
Native Exception,简称NE,是发生于C/C++ code里面最常见的一种异常,对于简单的NE,我们可以根据backtrace印出的调用逻辑来推断产生的原因。但是稍复杂一些的NE,比如memory corruption造成地址访问异常,比如某个变量在多层函数调用之间被异常篡改,比如函数指针未初始化造成的异常跳转等等,仅仅依靠log和backtrace就变得稍显力不从心了。
 
对于此类case,就需要深入了解architecture相关的知识以及各种相关的工具来进行汇编语言层次的分析。鉴于相关的知识分布比较发散,我们将debug NE需要的相关知识罗列在此供参考学习。
 
[SOLUTION]

第一,基础部分的学习:
 
ARM Architecture
参考文档Arm Architecture Reference Manual,在ARM官方网站就可以找到,可以找ARMv5TE的版本进行学习,有需要再参考ARMv7版本。其中part 1关于指令集架构的部分属于必修的部分,part 2关于mmu相关的部分也比较重要,对于更好的理解CPU的运作,进程管理,以及linux code的study都会有很大帮助。
ATPCS, ARM-THUMB procedure call standard
网络上有手册可以检索到,要能够了解过程调用的时候参数是如何通过寄存器和stack进行传递的。
 
以上两个部分对于各种C/C++ exception的处理都是通用的,对于想了解高端分析手法或者深入hack代码的人都是第一步必须精读的知识。
 
第二,针对Native Exception的部分:
 
Online/Offline Debug
学习如何使用arm-eabi-gdb来debug Android native层代码,包括使用gdb连接target来进行online debug,也包括利用gdb和coredump来还原异常现场进行基本分析。侧重在tool的使用以及熟悉两种debug手法的作用和局限性。(相关的知识也可以在网络上进行搜素)
                            Toolchain的使用
要知道如何通过arm-eabi-objdump进行反汇编,如果通过arm-eabi-addr2line去看某个地址对应的行号,如果通过arm-eabi-readelf去看elf的结构等等,对于arm-eabi-xxx等工具越熟悉越好。在熟悉ELF的结构之后,这些工具才能最大限度帮助提取更多的debug信息出来。
 
Linux的signal机制
可以参考《UNIX环境高级编程》第二版第10章,建议详细研究。(NE都会伴随signal的发出)
 
Ptrace机制
参考linux man page,以及网上的各种参考信息,了解使用方法,原理可以参考kernel code。(ptrace是用一个进程debug另外一个进程的机制,这也是GDB的核心实现机制)
 
coredump机制
可以参考linux man page (在linux PC终端提示符下敲man core)。coredump是debug NE最有效的手段。
 
ELF spec
arm的elf spec在网上可以搜索到,用arm elf进行检索即可。建议研究一下elf的结构,看看elf里面能够给我提供哪些debug信息。以及如何用arm-eabi-readelf来看这些信息。
 
unwind机制
参考Exception Handling ABI for the ARM Architecture,学习Android debuggerd进程里面是如何利用elf相关的信息来还原backtrace的。
 
debuggerd机制
参考android原生code,在/system/core/debuggerd下面。tombstone就是利用debuggerd去抓的。看code可以告诉你log里面那些NE的信息是怎么得到和印出的。