
# memcheck
#### 命令功能
检查动态申请的内存块是否完整，是否存在内存越界造成的节点损坏。
#### 命令格式
memcheck
#### 使用指南
- 打开内存完整性检查开关。
  - 目前只有bestfit内存管理算法支持该命令，需要使能LOSCFG_KERNEL_MEM_BESTFIT：
    ```
    Kernel ---> Memory Management ---> Dynamic Memory Management Algorithm ---> bestfit
    ```
    
  
  - 该命令依赖于LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK，使用时需要在菜单项中开启"Enable integrity check or not"。
    ```
    Debug  ---> Enable a Debug Version ---> Enable MEM Debug ---> Enable integrity check or not
    ```
    
   
- 当内存池所有节点完整时，输出"memcheck over, all passed!"。
- 当内存池存在节点不完整时，输出被损坏节点的内存块信息。
 
#### 使用实例
举例：
输入memcheck。
#### 输出说明
- 没有内存越界时，执行memcheck输出内容如下：
  ```
  Huawei LiteOS # memcheck
  system memcheck over, all passed!
  ```
  
- 发生内存越界时，执行memcheck输出内容如下：
  ```
  Huawei LiteOS # memcheck
  [ERR][OsMemIntegrityCheck], 1145, memory check error!
  freeNodeInfo.pstPrev:(nil) is out of legal mem range[0x80353540, 0x84000000]
  broken node head: (nil)  (nil)  (nil)  0x0, pre node head: 0x7fc6a31b  0x8  0x80395ccc  0x80000110
  ---------------------------------------------
   dump mem tmpNode:0x80395df4 ~ 0x80395e34
   0x80395df4 :00000000 00000000 00000000 00000000
   0x80395e04 :cacacaca cacacaca cacacaca cacacaca
   0x80395e14 :cacacaca cacacaca cacacaca cacacaca
   0x80395e24 :cacacaca cacacaca cacacaca cacacaca
  ---------------------------------------------
   dump mem :0x80395db4 ~ tmpNode:0x80395df4
   0x80395db4 :00000000 00000000 00000000 00000000
   0x80395dc4 :00000000 00000000 00000000 00000000
   0x80395dd4 :00000000 00000000 00000000 00000000
   0x80395de4 :00000000 00000000 00000000 00000000
  ---------------------------------------------
  cur node: 0x80395df4
  pre node: 0x80395ce4
  pre node was allocated by task:SerialShellTask
  cpu0 is in exc.
  cpu1 is running.
  excType:software interrupt
  taskName = SerialShellTask
  taskId = 8
  task stackSize = 12288
  system mem addr = 0x80353540
  excBuffAddr pc = 0x80210b78
  excBuffAddr lr = 0x80210b7c
  excBuffAddr sp = 0x803b2d50
  excBuffAddr fp = 0x80280368
  R0         = 0x59
  R1         = 0x600101d3
  R2         = 0x0
  R3         = 0x8027a300
  R4         = 0x1
  R5         = 0xa0010113
  R6         = 0x80395e04
  R7         = 0x80317254
  R8         = 0x803b2de4
  R9         = 0x4
  R10        = 0x803afca4
  R11        = 0x80280368
  R12        = 0x1
  CPSR       = 0x600101d3
  ```
  以上各关键输出项含义如下：
  - "mem check error"，表示检测到了内存节点被破坏。
  
  - "cur node："，表示该节点内存被踩，并打印内存地址。
  
  - "pre node："，表示被踩节点前面的节点，并打印节点地址。
  
  - "pre node was allocated by task:SerialShellTask"表示在SerialShellTask任务中发生了踩内存。
  
  - "taskName"和"taskId"，分别表示发生异常的任务名和任务ID。
   
 
