带有caffe的分段错误

时间:2016-09-12 16:50:13

标签: c++ segmentation-fault caffe

我在Windows上使用caffe,并且遇到了我无法查明的分段错误。它在程序退出时发生,WinDbg说scalar deleting destructor,不知道内存的分配位置。我的完整代码(目前是一个试图缩小范围的虚拟代码,但有时只会发生):

#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在unique或shared_ptr中进行了测试,但这完全没有任何区别。我对如何找到手头的问题感到茫然。

1 个答案:

答案 0 :(得分:2)

&#34;有时发生&#34;对于未定义的行为来说这是很常见的事情,这是你真正遇到的事情。分段错误是计算机可能做的理论上无限多的事情之一 - 行为实际上是未定义的。换句话说,正如他们在USENET上所说的那样:&#34;编译器使恶魔飞出你的鼻子是合法的。&#34;它可能会起作用,它可能会做一些奇怪的事情,或者它可能会引发一些像segfault这样的重大错误。

有专门用于跟踪分段错误和其他内存错误的工具。在Linux上,这通常是Valgrind,而在Windows上,您使用Dr. Memory。只要您使用包含的调试符号进行编译(-g),当您通过Dr. Memory运行可执行文件时,它应该为您提供分段错误的堆栈跟踪。

一旦得到堆栈跟踪,检查它的顶部以查看代码抱怨的析构函数,或者至少main.cpp中的哪一行代码调用函数负责未定义的行为。

此外,根据您的编译器,您可能会遇到known bug in VC

您可以在this answer找到有关细分错误,常见原因以及如何调试它们的更多常规信息。