1. crash 现象
在运行darknet对视频进行物体分类检测过程中,突然程序crash中止,报如下错误
Floating point exception (core dumped)
或者
浮点数例外(核心存储)
darknet的github有相关的issue: https://github.com/pjreddie/darknet/issues/1419
但是我遇到的问题是开始可以分类检测,后来crash的,与上面的一上来就crash不同。
所以进行了如下另外的拍错:
2. 原因分析
经过下面的"排查过程",发现最终原因是发生了分母为0的除法,导致crash
crash点在文件 src/yolo_layer.c的257行(具体行数可能会变)的 correct_yolo_boxes()
函数
new_w = (w*neth)/h;
因为传进来的h为0,所以导致程序crash.
3. 解决方法
在crash点处增加判断,放置除0错误,在 correct_yolo_boxes()
函数入口处添加防护如下:
if((0==w) || (0==h)) {
return 0;
}
4. 排查过程
上述定位crash点的排查过程如下,参考了博客"gdb调试详解与darknet框架gdb调试过程"(https://blog.csdn.net/zdaiot/article/details/83066133)的调试过程:
修改文件Makefile
,置DEBUG为1
DEBUG=1
重新编译darknet
make
开始调试
gdb ./darknet
输入运行程序需要的参数类型
set args detect cfg/yolov3-tiny.cfg yolov3-tiny.weights data/dog.jpg
set args detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights test.mp4
将src目录添加进来
DIR ./src
让程序运行直到crash
r
程序crash后,显示crash点如下,由此定位到crash点:

5. 参考
gdb调试详解与darknet框架gdb调试过程
https://blog.csdn.net/zdaiot/article/details/83066133
网友评论