2012年8月5日星期日

一次悲催的Debug经历

今天终于搞定了困扰我两天之久的一个令程序崩溃的bug,不过这个bug着实让我汗颜。
不多说,上代码。


enum MotionDirection{UP_RIGHT = 1,DOWN_LEFT,UP_LEFT,DOWN_RIGHT,
                     HORIZONTAL_LEFT,HORIZONTAL_RIGHT,
                    VERTICAL_UP,VERTICAL_DOWN};

void OpticalFlow::tracking(cv::Mat &frame, cv::Mat &output, std::vector<float> &wp)
{
...
float velocity[8] = {0.0};//8个方向的速度
int flags[8] = {0};//8个方向出现的次数
uint i = 0;
while( i < workingSet.size()) {
int pos = getOldVectorPos(workingSet[i],points[0]);
if(pos != NO_APPLICABLE_POINT_FOUND)
//计算当前特征点的方向和速度信息
countDirectionAndSpeed(workingSet[i],pos,velocity,flags);
++i;
}
...
//为下一帧跟踪初始化特征点集和灰度图像
std::swap(points[1], points[0]);
cv::swap(gray_prev, gray);
}
     这段代码的主要作用是进行人数统计和运动方向检测,但是每次程序运行都会崩溃。Debug设断点跟踪竟然是cv::swap(gray_prev,gray)引起的,其执行完后就会引发错误。然而这个函数是比我有经验的多的程序员写的,应该不会有问题。于是苦逼的继续调试,大约两个小时后,终于看到原来枚举变量MotionDirection的值是从1开始的,而我定义的两个数组velocity和flags下标都是从0开始,因此会造成越界的问题!
     想到这里,将上述定义改为
         float velocity[9] = {0.0};//8个方向的速度,第0位不用
         int flags[9] = {0};//8个方向出现的次数
     问题解决了。
总结:
     虽然是很小的一个问题,却让我认识到两方面的内容。其一,要相信库函数,除非有充分的证据。出问题先从自身找原因;其二,越界和粗心大意的写代码仍是我写的代码的主要崩溃手段。
     就这么多吧。最后送福利图一枚:,来自爱软。

没有评论:

发表评论