2016-09-12 67 views
1

我在Windows上使用caffe,並得到了我無法查明的細分錯誤。它發生在程序退出時,WinDbg說scalar deleting destructor,不知道內存分配的位置。我完整的代碼(目前空代碼試圖縮小它,但它發生只是有時):caffe的分割錯誤

#include <string> 
#include <vector> 

#include "boost/algorithm/string.hpp" 
#include "google/protobuf/text_format.h" 
#include <stdio.h> 

#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 

#include "caffe/blob.hpp" 
#include "caffe/common.hpp" 
#include "caffe/net.hpp" 
#include "caffe/proto/caffe.pb.h" 
#include "caffe/util/db.hpp" 
#include "caffe/util/format.hpp" 
#include "caffe/util/io.hpp" 

using caffe::Blob; 
using caffe::Caffe; 
using caffe::Datum; 
using caffe::Net; 
using std::string; 
namespace db = caffe::db; 

int main(int argc, char** argv) { 
    // Initialize logging with program call. First thing that needs to be done 
    ::google::InitGoogleLogging(argv[0]); 

    cv::Mat mean_; 

    // Set Caffe to run in CPU only mode 
    Caffe::set_mode(caffe::Caffe::CPU); 

    std::vector<std::string> labels_; 

    /*std::shared_ptr<Net<float>> caffe_test_net;*/ 
    Net<float>* caffe_test_net; 
    caffe_test_net = new Net<float>("D:\\Development\\caffe-windows\\models\\bvlc_reference_caffenet\\deploy.prototxt", caffe::Phase::TEST); 
    caffe_test_net->CopyTrainedLayersFrom("D:\\Development\\caffe-windows\\models\\bvlc_reference_caffenet\\bvlc_reference_caffenet.caffemodel"); 

    delete caffe_test_net; 
    return 1; 
} 

我有一個獨特的或者用的shared_ptr測試caffe_net,但並沒有區別的。我對如何發現手頭的問題感到不知所措。

回答

2

「有時會發生」是一個非常普遍的事情,具有未定義的行爲,這是你真正遇到的。分段錯誤是計算機可能做的理論上無數的事情之一 - 這種行爲實際上是不確定的。換句話說,正如他們在USENET上所說的那樣:「讓編譯器讓惡魔從你的鼻子裏飛出來是合法的。」它可能工作,它可能會做一些奇怪的事情,或者它可能會拋出一些像segfault一樣的重大錯誤。

有些工具專門用於追蹤分段錯誤和其他內存錯誤。在Linux上,這通常是Valgrind,而在Windows上,則使用Dr. Memory。只要您使用包含的調試符號進行編譯(-g),當您通過Dr. Memory運行可執行文件時,它應該爲您提供一個針對分段故障的堆棧跟蹤。

只要你得到堆棧跟蹤,檢查它的頂部,看看代碼發出的是哪個析構函數,或者至少在main.cpp的哪一行代碼正在調用負責該函數的函數未定義的行爲。

此外,根據您的編譯器,您可能會遇到known bug in VC

您可以在this answer上找到有關分段故障,常見原因以及如何調試它們的更多常規信息。

+0

好吧,我現在已經這樣做了,我主要得到錯誤「INVALID HEAP ARGUMENT:分配給operator new,釋放了自由 replace_free',但其中一個,我認爲是棺材中的最後一顆釘子是' UNADDRESSABLE ACCESS超越堆界限:寫入4個字節(s)',但創建無法訪問的訪問的代碼對我來說看起來很好。 – SinisterMJ

+0

好的,修復它。感謝您的輸入,這使得修復發生了:) – SinisterMJ