Ошибка сегментации - местоположение ошибки

Я использую некоторый код из bitbucket для моей дипломной работы. Насколько мне известно, указанный код должен быть без каких-либо ошибок. Моя проблема в том, что после того, как я скомпилировал его (включая некоторые дополнительные библиотеки), меня встретили с ошибкой сегментации. Возможно, кто-то сможет выяснить ошибку в моем make-файле или проанализировать журнал valgrind, поскольку у меня мало опыта с любым из них.

Что я использую:

Журнал Valgrind:

Makefile:

CC := g++
SRCEXT := cpp
HEADEXT := hpp

# libs and incs paths

OPENCL_LIB_PATH := -L/home/ubuntuvm/AMDAPPSDK-2.9-1/lib/x86_64
OPENCL_INC_PATH := -I/home/ubuntuvm/AMDAPPSDK-2.9-1/include

MONGO_CXX_DRIVER_LIB_PATH := -L/home/ubuntuvm/mongo-client-install/lib
MONGO_CXX_DRIVER_INC_PATH := -I/home/ubuntuvm/mongo-client-install/include

CCFITS_LIB_PATH := -L/home/ubuntuvm/lib
CCFITS_INC_PATH := -I/home/ubuntuvm/include

TURTLE_INC_PATH := -I/home/ubuntuvm/Downloads/turtle-1.2.6/include

# dirs and targets

SRCDIR := src
TEST_DIR := test
BUILDDIR := build
BINDIR := bin
TARGET := $(BINDIR)/quasar
OBJECT := $(BUILDDIR)/quasar/main.o

TEST_DATA_DIR := test_data
TEST_TARGET := $(BINDIR)/test
TEST_SOURCES := $(shell find $(TEST_DIR) -type f -name *.$(SRCEXT))
TEST_OBJECTS := $(patsubst $(TEST_DIR)/%,$(BUILDDIR)/test/%,$(TEST_SOURCES:.$(SRCEXT)=.o))

# flags and build 

TEST_FLAGS := $(TURTLE_INC_PATH) # -DSTAND_ALONE # -DMONGODB_TEST_LIVE -DMONGODB_TEST_PERFORMANCE
TEST_LIB := -lboost_unit_test_framework

SOURCES := $(shell find $(SRCDIR) -type f -name *.$(SRCEXT))
OBJECTS := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:.$(SRCEXT)=.o))
OBJECTS_NO_MAIN := $(filter-out $(OBJECT),$(OBJECTS))
INC := $(foreach path,$(SRCDIR),-I $(path))

CFLAGS := -D__CL_ENABLE_EXCEPTIONS -std=c++11 -Wall -Wextra $(MONGO_CXX_DRIVER_INC_PATH) $(OPENCL_INC_PATH) $(CCFITS_INC_PATH)
LIB := -pthread \
    $(MONGO_CXX_DRIVER_LIB_PATH) -lmongoclient \
    -lboost_thread -lboost_system -lboost_iostreams -lboost_filesystem -lboost_regex -lboost_program_options \
    $(OPENCL_LIB_PATH) -lOpenCL \
    $(CCFITS_LIB_PATH) -lcfitsio -lCCfits\
    -L/usr/local/lib\
    -I/usr/local/include\
    #-I/usr/local/include/libmongoc-1.0 -I/usr/local/include/libbson-1.0 -lmongoc-1.0 -lbson-1.0\
    #-Wl, -rpath /home/ubuntuvm/mongo-cxx-driver

    #$(pkg-config --cflags --libs libmongoc-1.0)

KERNEL_BINDIR = $(BINDIR)/cl
KERNELEXT := cl
SRCKERNELS := $(shell find $(SRCDIR) -type f -name *.$(KERNELEXT))
KERNELS_BINDIRS := $(patsubst $(SRCDIR)/quasar/%,%,$(SRCKERNELS:kernels.$(KERNELEXT)=))
BINKERNELS := $(patsubst $(SRCDIR)/quasar/%,%,$(SRCKERNELS))

all: kernels $(TARGET)

kernels: 
    @$(foreach path,$(KERNELS_BINDIRS), $(shell mkdir -p $(KERNEL_BINDIR)/$(path)))
    @$(foreach path,$(BINKERNELS), $(shell cp $(SRCDIR)/quasar/$(path) $(KERNEL_BINDIR)/$(path:kernels.$(KERNELEXT)='')))   

$(TARGET): $(OBJECTS_NO_MAIN) $(OBJECT)
    @mkdir -p $(BINDIR)
    $(CC) $^ -o $(TARGET) $(LIB)

$(BUILDDIR)/%.o: $(SRCDIR)/%.$(SRCEXT) $(SRCDIR)/%.$(HEADEXT)
    @mkdir -p $(dir $@)
    $(CC) $(CFLAGS) $(INC) -c -o $@ $<

$(BUILDDIR)/%.o: $(SRCDIR)/%.$(SRCEXT)
    @mkdir -p $(dir $@)
    $(CC) $(CFLAGS) $(INC) -c -o $@ $<

test_rebuild: test_clean test_norun

test: kernels $(TEST_TARGET)
    $(TEST_TARGET) $(TEST_RUN_FLAGS)

test_norun: kernels $(TEST_TARGET)

$(TEST_TARGET): $(OBJECTS_NO_MAIN) $(TEST_OBJECTS)
    @mkdir -p $(BINDIR)
    $(CC) $^ -o $(TEST_TARGET) $(LIB) $(TEST_LIB)   

$(BUILDDIR)/test/%.o: $(TEST_DIR)/%.$(SRCEXT) $(TEST_DIR)/%.$(HEADEXT)
    @mkdir -p $(dir $@)
    $(CC) $(CFLAGS) $(TEST_FLAGS) $(INC) -c -o $@ $<

$(BUILDDIR)/test/%.o: $(TEST_DIR)/%.$(SRCEXT)
    @mkdir -p $(dir $@)
    $(CC) $(CFLAGS) $(TEST_FLAGS) $(INC) -c -o $@ $<

test_clean:
    $(RM) -rf $(BUILDDIR)/test $(BINDIR)

clean:
    $(RM) -rf $(BUILDDIR) $(BINDIR)

rebuild: clean all

.PHONY: all clean test test_norun rebuild test_clean test_rebuild kernels

1 ответ

Эта ошибка:

==3272== Invalid read of size 4
==3272==    at 0x62BB64D: ??? (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==3272==    by 0x631B698: std::string::assign(std::string const&) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==3272==    by 0x508891: mongo::client::setOptions(mongo::client::Options const&) (basic_string.h:547)
==3272==    by 0x506C07: mongo::client::initialize(mongo::client::Options const&) (init.cpp:71)
==3272==    by 0x506F35: mongo::client::GlobalInstance::GlobalInstance(mongo::client::Options const&) (init.cpp:145)
==3272==    by 0x42EEEE: __static_initialization_and_destruction_0(int, int) (in /home/ubuntuvm/Downloads/quasar/bin/quasar)
==3272==    by 0x42EF61: _GLOBAL__sub_I__ZN8db_mongo8instanceE (in /home/ubuntuvm/Downloads/quasar/bin/quasar)
==3272==    by 0x57209C: __libc_csu_init (in /home/ubuntuvm/Downloads/quasar/bin/quasar)
==3272==    by 0x6CBFE54: (below main) (libc-start.c:246)
==3272==  Address 0xfffffffffffffff8 is not stack'd, malloc'd or (recently) free'd

означает, что ваша программа пыталась получить доступ к местоположению -8, Это происходит потому, что NULL был передан std::string::assign, либо как this или (более вероятно) в качестве строки, которая будет назначена из.

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

Насколько мне известно, указанный код должен быть без ошибок

Вы должны сразу же узнать, что не существует проекта любого нетривиального размера, который может претендовать на то, что он "без каких-либо ошибок".

Другие вопросы по тегам