Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Docs
提交
87bd2a29
D
Docs
项目概览
OpenHarmony
/
Docs
大约 2 年 前同步成功
通知
161
Star
293
Fork
28
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
Docs
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
87bd2a29
编写于
4月 06, 2022
作者:
A
Austin
提交者:
Gitee
4月 06, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
update zh-cn/device-dev/kernel/kernel-small-debug-user-function.md.
Signed-off-by:
N
Austin
<
liaozhiqi7@huawei.com
>
上级
dc5bb8e8
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
6 addition
and
0 deletion
+6
-0
zh-cn/device-dev/kernel/kernel-small-debug-user-function.md
zh-cn/device-dev/kernel/kernel-small-debug-user-function.md
+6
-0
未找到文件。
zh-cn/device-dev/kernel/kernel-small-debug-user-function.md
浏览文件 @
87bd2a29
...
@@ -13,11 +13,13 @@
...
@@ -13,11 +13,13 @@
释放内存时:根据需要释放的内存地址匹配内存节点控制块并将该控制块删除。
释放内存时:根据需要释放的内存地址匹配内存节点控制块并将该控制块删除。
**图1**
堆内存节点信息链表
**图1**
堆内存节点信息链表


申请内存时,返回地址会被保存到LR寄存器中。进程运行过程中,系统会在内存节点控制块中添加疑似泄漏点对应的lr等信息。如下图所示:
申请内存时,返回地址会被保存到LR寄存器中。进程运行过程中,系统会在内存节点控制块中添加疑似泄漏点对应的lr等信息。如下图所示:
**图2**
堆内存节点信息
**图2**
堆内存节点信息


其中,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**
泄漏点代码行定位流程


...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录