更新时间:2021-07-08 GMT+08:00
分享

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。

相关文档