2016-09-12 3 views
1

Я использую caffe для Windows и получаю ошибки сегментации, которые я не могу определить. Это происходит, когда программа выходит, и 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; 
} 

я испытал с caffe_net в уникальном или shared_ptr, но это не имеет никакого значения вообще. Я не понимаю, как найти проблему.

ответ

2

«Бывает иногда» - довольно распространенная вещь с неопределенным поведением, с которой вы действительно сталкиваетесь. Ошибка сегментации является одним из теоретически бесконечного числа вещей, которые может сделать компьютер - поведение буквально не определено. Другими словами, как говорится в USENET: «Это законно для компилятора, чтобы заставить демонов вылететь из вашего носа». Это может сработать, это может сделать что-то странное, или это может вызвать некоторые серьезные ошибки, такие как segfault.

Есть инструменты, специально предназначенные для отслеживания ошибок сегментации и других ошибок памяти. В Linux это вообще Valgrind, а в Windows вы используете Dr. Memory. До тех пор, пока вы скомпилировали с включенными отладочными символами (-g), при запуске исполняемого файла через Dr. Memory он должен дать вам трассировку стека для ошибки сегментации.

Как только вы получите трассировку стека, проверьте верхнюю часть его, чтобы увидеть, какой деструктор пронесет код или, по крайней мере, какая строка кода в main.cpp вызывает функцию (функции), отвечающую за неопределенное поведение.

Кроме того, в зависимости от вашего компилятора вы можете столкнуться с known bug in VC.

Более подробную информацию об ошибках сегментации, общих причинах и способах их отладки можно найти на странице this answer.

+0

Хорошо, я сделал это сейчас, и я получаю в основном ошибку 'INVALID HEAP ARGUMENT: выделен оператором new, освобожденный со свободным replace_free', но тот, который я бы предположил, является последним гвоздем в гробу, UNADDRESSABLE ACCESS за пределами границ кучи: запись 4 байт (ов) ', но код, создающий этот неадресационный доступ, выглядит для меня прекрасным. – SinisterMJ

+0

Хорошо, исправил. Спасибо за ваш вклад, это заставило исправить ситуацию :) – SinisterMJ

Смежные вопросы