2016-04-16 12 views
1

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.

image showing OK and ! but stalled wheels for three tests

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!

Antwort

0

TL; DR: Stellen Sie sicher, dass Sie Ihre Druckanweisungen mit einer neuen Zeile beenden.

Es gab ein sehr, sehr wichtiges Detail, das ich ausließ, als ich das Problem beschrieb. Ich beschloss, die cout Zeilen auszukürzen, die ich verwendet habe, um einige Informationen aus meiner Beschreibung hier zu debuggen. Der ursprüngliche Code ist:

void PointCloud::transform(omar::Pose otherCameraPose) { 
    //cv::Mat oldPoints(pointsAndIntensities, cv::Range(0, 3)); 

    cv::Mat transformedPoints = otherCameraPose.world2camera(pointsAndIntensities(cv::Range(0, 3), cv::Range::all())); 
    cv::Mat replaceablePoints(pointsAndIntensities, cv::Range(0, 3)); 
    std::cout << "Transformed: " << transformedPoints.col(3) << std::endl; 
    std::cout << "Original: " << replaceablePoints.col(3) << std::endl; 
    transformedPoints.copyTo(replaceablePoints); 
    std::cout << "Replaced?: " << pointsAndIntensities.col(3); 
} 

ich mehr in den Code zu graben beschlossen, die genaue Zeile zu finden, die die Hänge verursacht wurde, falls es im Speicher einige Fehler. Ich habe es bis zur obigen Methode transform verfolgt, und es stellte sich heraus, dass es die std::cout Zeilen waren, die ich dort hatte. Ich wusste nicht, ob die Verwendung des Stream-Mid-Tests zu Problemen führte. Es stellte sich heraus, dass ich meine letzte Druckanweisung nicht mit einer std::endl beendet hatte.

Meine Vermutung ist, dass CLION auf der cout Ausgabe von Gtest zu finden, um beruht, ob ein Test besteht oder nicht, und weil die [ OK ] PointCloudTest.FlipHorizontal (205 ms) nicht auf eine neue Linie war es nicht erkannte der Test erfolgreich beendet hatte.