Ich debugge eine Anwendung, die ich mit C++ in CLion geschrieben habe und teste es mit Google Test. Es ist eine Implementierung eines Computer-Vision-Papiers, das ich gefunden habe, und ich benutze OpenCV für seine Mat-Klasse und Bildmanipulationsfunktionen.CLion Ausführung durch einige GTest TEST_F hängt, Schritt-für-Schritt-Debugging geht rückwärts?
Drei meiner Testfunktionen verhielten sich sehr unberechenbar; Hier ist eine.
/**
* Create a flat point cloud and flip it horizontally
*/
TEST_F(PointCloudTest, FlipHorizontal) {
// load image & set constants
cv::Mat image = omar::imreadAsGrayDouble(dirname + "uttower.png");
cv::Mat flippedImage = omar::imreadAsGrayDouble(dirname + "uttower_horz.png");
double fLength = 200.0; // for this, the flength is arbitrary as long as it's the same.
// build point cloud
omar::PointCloud pc(image, fLength);
/* Build the other camera pose
* Specifically, rotated pi over Y
* and 2 focal lengths out into Z+ space.
* It's written as 2.001 to test whether small variations affect point placement*/
omar::Pose otherCamera(0.0, 0.0, 2.001, 0.0, M_PI, 0.0);
// flip horizontally
omar::PointCloud newPc = pc.viewPoints(otherCamera);
cv::Mat newImage = newPc.renderToImage(fLength, image.rows, image.cols);
omar::assertMatEquals(flippedImage, newImage, 10 * DBL_EPSILON);
}
und das Gtest Debugging-System würde die Ausgabe zur Verfügung stellen, als ob es beendet:
[ OK ] PointCloudTest.FlipHorizontal (205 ms)
aber das Symbol nie etwas geändert signalisiert, dass der Test beendet.
Als ich es debuggen ging, wenn ich einen Haltepunkt an der Unterseite der Funktion eingestellt, würde es aufhören, dann für jedes Mal, wenn ich gedrückt „Step Over“, es würde springen up der Rest der Linien, eins nach dem anderen, dann zu beenden. Dies stellt sich als das Debugging-Verhalten aller Tests heraus.
Die hängenden Tests unterscheiden sich nur geringfügig von einem anderen Test, der bestanden hat. Insbesondere ist diese Linie die viewPoints
Linie. Hier ist der relevante Code:
PointCloud::PointCloud(const PointCloud& other) {
pointsAndIntensities = other.pointsAndIntensities.clone();
}
PointCloud PointCloud::viewPoints(omar::Pose otherCameraPose) {
PointCloud otherPointCloud = PointCloud(*this);
otherPointCloud.transform(otherCameraPose);
return otherPointCloud;
}
void PointCloud::transform(omar::Pose otherCameraPose) {
cv::Mat transformedPoints = otherCameraPose.world2camera(pointsAndIntensities(cv::Range(0, 3), cv::Range::all()));
cv::Mat replaceablePoints(pointsAndIntensities, cv::Range(0, 3));
transformedPoints.copyTo(replaceablePoints);
}
Ich mag würde den Grund für diese Bestellung verstehen, aber es kann oder nicht auf das wahre Problem in Zusammenhang stehen kann, die die hängenden Tests sind. Technisch sind alle drei Tests bestanden, aber ich denke, dass dieses Problem viele Probleme auf der Straße verursachen wird. Ich bin am Ende meines Wissens. Hilfe und Nachfragen sind willkommen!