昇腾学院 | 案例分享 业务踩内存问题
【摘要】 问题现象描述:问题现象:客户在运行视频分析业务时,业务流程如下图:当执行人脸登记业务时,即上图中的左边支路,会使得device侧程序core dump。 关键过程、根本原因分析关键过程:1.通过gdb调试,确定core dump发生于视频流解码处:如下图所示:2.排查memcpy失败原因。将memcpy处理的内存地址以及内存大小进行打印,发现内存大小正确如下图所示。因此不会因为内存越界导致m...
问题现象描述:
问题现象:客户在运行视频分析业务时,业务流程如下图:
当执行人脸登记业务时,即上图中的左边支路,会使得device侧程序core dump。
关键过程、根本原因分析
关键过程:
1.通过gdb调试,确定core dump发生于视频流解码处:如下图所示:
2.排查memcpy失败原因。将memcpy处理的内存地址以及内存大小进行打印,发现内存大小正确如下图所示。因此不会因为内存越界导致memcpy失败。猜测可能是内存被踩。
3.逐步缩小定位范围。保持视频分析业务运行,从下至上逐个关闭线程,再进行人脸登记操作,定位出face_detection人脸检测线程导致了程序崩溃。
4.检视face_detection线程代码中的释放内存操作,对每个释放内存操作进行验证,最终定位出导致程序崩溃的代码段,如下图所示:
根本原因分析:
1、申请内存时,程序按照输入图片的实际大小进行申请。
2、但是在释放内存时,程序对图片大小进行了2MB的大小对齐,导致在释放内存时,释放大小要比实际内存要大,内存被踩,最终导致device侧程序出现core dump。
结论、解决方案及效果
结论:
1、程序释放内存时的大小超出了实际申请的内存大小,踩内存导致程序崩溃。
解决方案:
1、 去除内存大小的对齐,释放实际大小的内存,即可解决问题。如下图所示:
经验总结、预防措施和规范建议
1、 对于程序崩溃,例如core dump,segment fault等问题,可以借助GDB工具,一步步定位问题所在。
2、 对于内存操作,最好使用智能指针进行管理,防止指针操作之间发生踩内存。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)