Я пытаюсь найти причину сбоя в моей программе.
Этот сбой происходит после нескольких часов исполнения. Я запустил его, используя gdb, который сообщает мне, в какой строке кода произошел сбой.
GDB говорит мне, что программа имеет Исключение с плавающей запятой на следующей строке:
(*itCand)->setCandidateObjectData(centroid,
(*itCand)->_toSendCentroid,
bbox,
sumAreaFilled,
sumAreaEdges,
height ,
(*itCand)->_sumAreaMask / (*itCand)->_nTimesAlive,
(*itCand)->_sumAreaEdges / (*itCand)->_nTimesAlive,
(*itCand)->_sumHeight / (*itCand)->_nTimesAlive ,
sumAreaEdges,
height,
maxHeight,
false,
false,
false,
true,
hasChangedPosition);
Эта функция присваивает данные объекту. Параметры sumAreaFilled, sumAreaEdges и height являются инкрементными параметрами, которые продолжают увеличиваться каждую секунду выполнения, и по этой причине они имеют тип unsigned long long, чтобы избежать каких-либо проблем с памятью.
Параметр nTimesAlive инициализируется как 1 и продолжает увеличивать каждый кадр, так что он никогда не может быть нулевым.
остальные операции являются простыми назначениями, поэтому я думаю, что они не являются источником какой-либо проблемы, но я вставлю функцию и тип данных, чтобы вы могли получить всю информацию, необходимую для понимания проблемы.
class CandidateObject
{
public:
CandidateObject(const cv::Point centroid, const cv::Rect bboxNormal);
~CandidateObject();
void setCandidateObjectData(const cv::Point centroid, const cv::Point toSendCentroid, const cv::Rect bboxNormal,
const unsigned long long sumAreaMask, const unsigned long long sumAreaEdges, const unsigned long long sumHeight,
const double meanAreaMask, const double meanAreaEdges, const double meanHeight, const double instantEdgeArea, const double height,
const double maxHeight, const bool isToDelete, const bool isDuplicate, const bool isBeingDoubleChecked, const bool isMatched,
const bool hasChangedPosition);
cv::Point _centroid; //-- blob centroid
cv::Point _toSendCentroid; //-- blob centroid to send to the conversion function
cv::Rect _bboxNormal; //-- normal bounding box
unsigned long long _sumAreaMask; //-- pixel sum on object bounding box mask
unsigned long long _sumAreaEdges; //-- pixel sum on edge
unsigned long long _sumHeight; //-- sum of height instances
double _meanAreaMask; //-- mean of total instances of object area in bounding box mask
double _meanEdgeAreaMask; //-- mean of total instances of object area in the edge bounding box mask
double _meanHeight; //-- mean of total instances of object height
double _instantEdgeArea; //-- Area of edges that correspond to a certain object
unsigned short _nTimesAlive; //-- number of times blob appears
bool _isToDelete; //-- flag that indicates if candidate object is no longer valid and to be deleted from vector
bool _isDuplicate; //-- indicates if same object is detected multiple times
bool _isBeingDoubleChecked; //-- indicates if object is being double checked after first matching fails
bool _isMatched; //-- indicates if object has already been matched, in order to avoid unnecessary processing
bool _hasChangedPosition; //-- indicates if the object has changed its position significantly
double _height; //-- object height
double _maxHeight; //-- max height
unsigned int _label;
};
И функция:
void CandidateObject::setCandidateObjectData(const cv::Point centroid, const cv::Point toSendCentroid, const cv::Rect bboxNormal,
const unsigned long long sumAreaMask, const unsigned long long sumAreaEdges, const unsigned long long sumHeight,
const double meanAreaMask, const double meanAreaEdges, const double meanHeight, const double instantEdgeArea, const double height,
const double maxHeight, const bool isToDelete, const bool isDuplicate, const bool isBeingDoubleChecked, const bool isMatched, const bool hasChangedPosition)
{
_centroid = centroid;
_toSendCentroid = toSendCentroid;
_bboxNormal = bboxNormal;
_sumAreaMask += sumAreaMask;
_sumAreaEdges += sumAreaEdges;
_sumHeight += sumHeight;
_meanAreaMask = meanAreaMask;
_meanEdgeAreaMask = meanAreaEdges;
_meanHeight = meanHeight;
_instantEdgeArea = instantEdgeArea;
_isToDelete = isToDelete;
_isDuplicate = isDuplicate;
_isBeingDoubleChecked = isBeingDoubleChecked;
_isMatched = isMatched;
_height = height;
_maxHeight = maxHeight;
_hasChangedPosition = hasChangedPosition;
return;
}
Похоже, проблема возникает до того, как элемент управления достигнет тела функции. Поэтому я думаю, что наиболее вероятный источник ошибки находится в следующих строках:
(*itCand)->_sumAreaMask / (*itCand)->_nTimesAlive,
(*itCand)->_sumAreaEdges / (*itCand)->_nTimesAlive,
(*itCand)->_sumHeight / (*itCand)->_nTimesAlive ,
С помощью GDB вы можете проверить, является ли указатель на itCand действительным, и каково значение _nTimesAlive в момент возникновения исключения. Вы также можете попытаться объявить 3 временные переменные непосредственно перед вызовом функции, чтобы сохранить эти 3 результата вычисления, а затем передать их функции. Таким образом, вы заставите GDB сообщать точную строку, которая вызывает проблему, и собирать более подробную информацию о сбое.
Других решений пока нет …