есть функция:
extern "C" BOOST_SYMBOL_EXPORT bool executeJsonRequestCB(const char* request, std::size_t requestSize, boost::function<void(const char*, std::size_t)>);
BOOST_DLL_ALIAS(executeJsonRequestCB, aaaModule);
В приложении хочу вызвать данную функцию, делаю так:
boost::function<bool(const char* request, std::size_t requestSize, boost::function<void(const char*, std::size_t)>)> requestHandler = myLoadedLib.get_alias<bool(const char* request, std::size_t requestSize, boost::function<void(const char*, std::size_t)>)>("aaaModule");
std::string responce;
boost::function<void(const char*, std::size_t)> saveDataFunc = [&responce](const char* data, std::size_t size) -> void {
responce.assign(data, size);
};
std::string request = "{JSON STRING}";
auto result = requestHandler(request.c_str(), request.size(), saveDataFunc);
Но почему-то приложение падает с 41489 segmentation fault (core dumped)
Через gdb проверяю, натыкаюсь на это:
Program received signal SIGSEGV, Segmentation fault.
0x00005555555689f8 in boost::detail::function::function_invoker3<bool (*)(char const*, unsigned long, boost::function<void (char const*, unsigned long)>), bool, char const*, unsigned long, boost::function<void (char const*, unsigned long)> >::invoke(boost::detail::function::function_buffer&, char const*, unsigned long, boost::function<void (char const*, unsigned long)>) (function_ptr=..., a0=0x555555597eb0 "{ \"param1\": \"value1\", \"param2\": null }", a1=41, a2=...) at /home/depish/.conan/data/boost/1.72.0/_/_/package/dc8aedd23a0f0a773a5fcdcfe1ae3e89c4205978/include/boost/function/function_template.hpp:100
100 return f(BOOST_FUNCTION_ARGS);
С чем это может быть связано, как решается? я бы мог передавать и сырой указатель на функцию, но в такой указатель невозможно передать лямбду с захватом.
А чем тебя std::function не устроил?
библиотека и приложение собираются разными версиями компилятора на разных системах, и флаги и прочее не известно, боюсь там уже поломан ABI
Что-то не верю в это В стд очень не любят аби ломать
ну вот я пытался просто std::string передать и все сломалось =(
Ты пользуешься gcc 4?
приложение GCC 4.8 библиотека GCC 11
кромешный
А версии буста внутри библиотеки и снаружи совпадают? Вижу ответ
Ну а ты уверен, что у тебя указатели не инвалидируются?
ну по крейней мере в ифах все нормально, нет ошибок if (callback.empty()) LOG_ERROR << "Callback is null"; if (!callback) LOG_ERROR << "WTF!!!!";
Я про твой сырой указатель с реквестом
как может быть поломано то, чего нет?
Это, однозначно, связано с ошибкой в твоей программе. Где эта ошибка - предстоит найти тебе.
Обсуждают сегодня