• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 常见问题定位方法<a name="ZH-CN_TOPIC_0000001079096842"></a>
2
3-   [通过异常信息定位问题](#section695838161711)
4-   [内存池完整性验证](#section362917569179)
5-   [全局变量踩内存定位方法](#section18971311121816)
6
7## 通过异常信息定位问题<a name="section695838161711"></a>
8
9系统异常被挂起后,会在串口看到一些关键寄存器的信息,如图1所示。可通过这些信息定位到异常所在函数和其调用栈关系,为原因分析提供第一手资料。
10
11图1 异常信息
12
13![](figure/zh-cn_image_0000001173429547.png)
14
15上图中的异常信息主要解释4个标签:
16
17**标签1**:标识异常在内核态;
18
19**标签2**:标识了异常类型(数据异常时,far后的值是系统异常时CPU访问的地址);
20
21**标签3**:pc的值标识系统异常时执行指令的位置,klr的值一般标识pc所在函数执行完后下一条要执行的命令。(**注:标签4处 traceback 0  lr有值时不用关注klr**)。
22
23**标签4**:lr 的值依次标识正常情况下PC要依次执行的指令的位置。
24
25对于内核异常打印信息,确定PC和LR的具体位置的指令需要结合out目录下OHOS\_Image.asm(跟烧写的系统镜像OHOS\_Image.bin对应的汇编文件)查看,根据指令所在的位置可确认使用该指令的函数,依次确定LR位置所在的函数,即得到异常发生时的函数调用关系。
26
27## 内存池完整性验证<a name="section362917569179"></a>
28
29仅凭上节异常信息定位的基本方法,常常无法直接定位问题所在。并且常常会因为异常的寄存器值而无法对问题进行定位。若怀疑是堆内存越界导致的问题,可以调用内存池完整性检测函数LOS\_MemIntegrityCheck进行检查。函数LOS\_MemIntegrityCheck将会对系统动态内存池所有的节点进行遍历,如果所有节点正常则函数返回0,不会有任何打印,否则将打印相关的错误信息。该函数的入参使用\(VOID \*\)OS\_SYS\_MEM\_ADDR。
30
31定位堆内存越界踩的问题,一般是在可能存在问题的业务逻辑代码前后使用LOS\_MemIntegrityCheck,如果该业务代码不存在问题,则前后两次LOS\_MemIntegrityCheck调用不会失败,按前述方式逐步缩小问题定位范围。
32
33## 全局变量踩内存定位方法<a name="section18971311121816"></a>
34
35如果已知一个全局变量内存域被踩,可在OHOS\_Image.map文件中找到该全局变量所在的地址,并且特别注意该地址之前最近被使用的变量,有极大概率是前面的变量(尤其数组类型的或会被强转成其他类型的变量)在使用的过程中内存越界,破坏了这个全局变量。
36
37