未验证 提交 87bd2a29 编写于 作者: A Austin 提交者: Gitee

update zh-cn/device-dev/kernel/kernel-small-debug-user-function.md.

Signed-off-by: NAustin <liaozhiqi7@huawei.com>
上级 dc5bb8e8
...@@ -13,11 +13,13 @@ ...@@ -13,11 +13,13 @@
释放内存时:根据需要释放的内存地址匹配内存节点控制块并将该控制块删除。 释放内存时:根据需要释放的内存地址匹配内存节点控制块并将该控制块删除。
**图1** 堆内存节点信息链表 **图1** 堆内存节点信息链表
![zh-cn_image_0000001165890158](figures/zh-cn_image_0000001165890158.png) ![zh-cn_image_0000001165890158](figures/zh-cn_image_0000001165890158.png)
申请内存时,返回地址会被保存到LR寄存器中。进程运行过程中,系统会在内存节点控制块中添加疑似泄漏点对应的lr等信息。如下图所示: 申请内存时,返回地址会被保存到LR寄存器中。进程运行过程中,系统会在内存节点控制块中添加疑似泄漏点对应的lr等信息。如下图所示:
**图2** 堆内存节点信息 **图2** 堆内存节点信息
![zh-cn_image_0000001165890518](figures/zh-cn_image_0000001165890518.png) ![zh-cn_image_0000001165890518](figures/zh-cn_image_0000001165890518.png)
其中,TID表示线程ID;PID表示进程ID;ptr表示申请的内存地址;size表示申请的内存大小;lr[n]表示函数调用栈地址,变量n可以根据具体场景的需要进行配置。 其中,TID表示线程ID;PID表示进程ID;ptr表示申请的内存地址;size表示申请的内存大小;lr[n]表示函数调用栈地址,变量n可以根据具体场景的需要进行配置。
...@@ -27,6 +29,7 @@ ...@@ -27,6 +29,7 @@
用户通过串口或文件等方式,将各个进程内存调测信息导出,利用addr2line工具将导出的信息转换成导致内存泄漏的代码行,便可以解决内存泄露问题。 用户通过串口或文件等方式,将各个进程内存调测信息导出,利用addr2line工具将导出的信息转换成导致内存泄漏的代码行,便可以解决内存泄露问题。
**图3** 泄漏点代码行定位流程 **图3** 泄漏点代码行定位流程
![zh-cn_image_0000001165730464](figures/zh-cn_image_0000001165730464.png) ![zh-cn_image_0000001165730464](figures/zh-cn_image_0000001165730464.png)
...@@ -41,15 +44,18 @@ ...@@ -41,15 +44,18 @@
用户程序申请堆内存时,在堆内存节点处添加校验值等信息,如果校验值异常,则很有可能是前一块堆内存使用越界导致的(目前无法识别校验值被野指针破坏的场景)。在内存申请、释放时校验内存节点校验值的正确性,若内存节点被破坏,校验失败时则输出tid、pid及当前被踩节点前一块堆内存申请时保存的调用栈信息,通过addr2line工具可获得具体的代码行信息,辅助用户解决问题。 用户程序申请堆内存时,在堆内存节点处添加校验值等信息,如果校验值异常,则很有可能是前一块堆内存使用越界导致的(目前无法识别校验值被野指针破坏的场景)。在内存申请、释放时校验内存节点校验值的正确性,若内存节点被破坏,校验失败时则输出tid、pid及当前被踩节点前一块堆内存申请时保存的调用栈信息,通过addr2line工具可获得具体的代码行信息,辅助用户解决问题。
**图4** node节点头信息添加校验值 **图4** node节点头信息添加校验值
![zh-cn_image_0000001211449151](figures/zh-cn_image_0000001211449151.png) ![zh-cn_image_0000001211449151](figures/zh-cn_image_0000001211449151.png)
free堆内存时,不会立即把该内存块释放掉,而是在内存中写入魔术数字0xFE,并放到free队列中(保证在一定时间内不会再被malloc函数分配),当有野指针或use-after-free的情况对该内存进行读取的操作时,能够发现数据异常,但是对于写操作则无法判断出来。 free堆内存时,不会立即把该内存块释放掉,而是在内存中写入魔术数字0xFE,并放到free队列中(保证在一定时间内不会再被malloc函数分配),当有野指针或use-after-free的情况对该内存进行读取的操作时,能够发现数据异常,但是对于写操作则无法判断出来。
**图5** free流程图 **图5** free流程图
![zh-cn_image_0000001165890904](figures/zh-cn_image_0000001165890904.png) ![zh-cn_image_0000001165890904](figures/zh-cn_image_0000001165890904.png)
- 使用malloc申请内存(大于0x1c000bytes时通过mmap申请) - 使用malloc申请内存(大于0x1c000bytes时通过mmap申请)
当malloc通过mmap申请大块内存时,在返回给用户使用的内存区间头和尾分别多申请一个页,一个页PAGE_SIZE当前为0x1000,这两个页分别通过mprotect接口设置权限为PROT_NONE(无可读可写权限),可以有效防止内存越界读写问题:越界读写数据时由于无读写权限而导致用户程序异常,根据异常调用栈信息可找到相应的代码逻辑。 当malloc通过mmap申请大块内存时,在返回给用户使用的内存区间头和尾分别多申请一个页,一个页PAGE_SIZE当前为0x1000,这两个页分别通过mprotect接口设置权限为PROT_NONE(无可读可写权限),可以有效防止内存越界读写问题:越界读写数据时由于无读写权限而导致用户程序异常,根据异常调用栈信息可找到相应的代码逻辑。
**图6** malloc通过mmap机制申请内存的内存布局 **图6** malloc通过mmap机制申请内存的内存布局
![zh-cn_image_0000001211130993](figures/zh-cn_image_0000001211130993.png) ![zh-cn_image_0000001211130993](figures/zh-cn_image_0000001211130993.png)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册