昇腾学院 | 案例分享 HIAI_DMalloc接口出现double free问题

举报
xiongoal 发表于 2020/03/25 02:24:19 2020/03/25
【摘要】 问题现象描述问题现象:业务调试过程中,程序出现double free异常,日志报错如下:关键过程、根本原因分析关键过程:1、 使用HIAI_DMalloc接口为host侧的输入文件申请内存,如下所示: 2、 通过SendData函数发送数据结构体到device侧。3、 由于传入的buffer是智能指针,会自动释放一次内存。 4、 HIAI_DMalloc申请的...

问题现象描述

问题现象:业务调试过程中,程序出现double free异常,日志报错如下:

1.png


关键过程、根本原因分析

关键过程:

1、  使用HIAI_DMalloc接口为host侧的输入文件申请内存,如下所示:

       1.png

2、  通过SendData函数发送数据结构体到device侧。

3、  由于传入的buffer是智能指针,会自动释放一次内存。

       1.png

4、  HIAI_DMalloc申请的内存通过SendData发送,Matrix框架内部又会自动释放一次。

       1.png

5、  HIAI_DMalloc申请的内存被重复释放两次,通过修改智能指针的默认释放内存方式,保证该内存只被释放一次。

       1.png

       1.png

根本原因分析:

1、序列化结构体中使用智能指针存储数据,同时通过SendData函数跨侧传输该数据,整个过程中该内存会被释放两次。


结论、解决方案及效果

结论:通过修改智能指针的默认释放内存方式,保证内存只被释放一次。


经验总结、预防措施和规范建议

通过HIAI_DMalloc接口申请内存,关于内存管理,请注意以下要点:

1、申请自动释放内存,用于HostDeviceDeviceHost的数据传输时,如果是智能指针,由于Matrix框架自动释放内存,所以智能指针指定的析构器必须是空的;如果非智能指针,则Matrix框架自动释放。

2、申请手动释放内存,用于HostDeviceDeviceHost的数据传输时,如果是智能指针,则需要指定析构器为HIAIMemory::HIAI_DFree;如果非智能指针,则数据发送完成后需要调用HIAIMemory::HIAI_DFree释放内存。

3、申请自动释放内存,对于该内存中的数据,不允许多次调用SendData接口发送数据。

4、申请手动释放内存时,如果用于HostDeviceDeviceHost的数据传输时,在内存释放前,不可复用内存中的数据;如果用于HostHostDeviceDevice的数据传输时,在内存释放前,可以复用内存中的数据。

5、申请手动释放内存时,如果调用SendData接口异步传输数据,发送数据后,不允许修改内存中的数据。



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。