В коде Python я использую ctypes
(позже переключился на Cython
) вызывать функции из разделяемой библиотеки C ++, которую я написал сам. Библиотека представляет собой небольшую оболочку над сторонней библиотекой (OpenFOAM, чтобы быть конкретным, но не важным для этого вопроса). Сторонняя библиотека использует MPI (и, скорее всего, также PETSc), и это вызывает у меня проблемы, когда я пытаюсь позвонить contains_points
от matplotlib.path.Path
,
Каждый раз звоню contains_points
до того, как я вызвал функцию из библиотеки C ++, она работала нормально. Но когда я пытаюсь позвонить contains_points
после того, как я хотя бы вызвал одну функцию из библиотеки C ++, я получаю следующую ошибку:
[0]PETSC ERROR: ------------------------------------------------------------------------
[0]PETSC ERROR: Caught signal number 8 FPE: Floating Point Exception,probably divide by zero
[0]PETSC ERROR: Try option -start_in_debugger or -on_error_attach_debugger
[0]PETSC ERROR: or see http://www.mcs.anl.gov/petsc/documentation/faq.html#valgrind[0]PETSC ERROR: or try http://valgrind.org on GNU/linux and Apple Mac OS X to find memory corruption errors
[0]PETSC ERROR: configure using --with-debugging=yes, recompile, link, and run
[0]PETSC ERROR: to get more information on the crash.
--------------------------------------------------------------------------
MPI_ABORT was invoked on rank 0 in communicator MPI_COMM_WORLD
with errorcode 59.
NOTE: invoking MPI_ABORT causes Open MPI to kill all MPI processes.
You may or may not see output from other processes, depending on
exactly when Open MPI kills them.
--------------------------------------------------------------------------
Что здесь происходит и как я могу решить это? Заранее большое спасибо!
ОБНОВЛЕНИЕ 27/07/2016
Я попытался создать как можно более минималистичный фрагмент кода, чтобы воспроизвести ошибку. Ошибка теперь другая и более многословная, но по сути та же самая. Триггер все еще Исключение с плавающей точкой:
#0 Foam::error::printStack(Foam::Ostream&) at ??:?
#1 Foam::sigFpe::sigHandler(int) at ??:?
#2 ? in "/usr/lib/libpthread.so.0"#3 agg::math_stroke<agg::pod_bvector<agg::point_base<double>, 6u> >::calc_join(agg::pod_bvector<agg::point_base<double>, 6u>&, agg::vertex_dist const&, agg::vertex_dist const&, agg::vertex_dist const&, double, double) at ??:?
#4 agg::vcgen_contour::vertex(double*, double*) at ??:?
#5 agg::conv_adaptor_vcgen<agg::conv_curve<PathNanRemover<agg::conv_transform<py::PathIterator, agg::trans_affine> >, agg::curve3, agg::curve4>, agg::vcgen_contour, agg::null_markers>::vertex(double*, double*) at ??:?
#6 void point_in_path_impl<agg::conv_contour<agg::conv_curve<PathNanRemover<agg::conv_transform<py::PathIterator, agg::trans_affine> >, agg::curve3, agg::curve4> >, numpy::array_view<double const, 2>, numpy::array_view<bool, 1> >(numpy::array_view<double const, 2>&, agg::conv_contour<agg::conv_curve<PathNanRemover<agg::conv_transform<py::PathIterator, agg::trans_affine> >, agg::curve3, agg::curve4> >&, numpy::array_view<bool, 1>&) at ??:?
#7 ? at ??:?
#8 PyCFunction_Call in "/usr/lib/libpython3.5m.so.1.0"#9 PyEval_EvalFrameEx in "/usr/lib/libpython3.5m.so.1.0"#10 ? in "/usr/lib/libpython3.5m.so.1.0"#11 PyEval_EvalFrameEx in "/usr/lib/libpython3.5m.so.1.0"#12 ? in "/usr/lib/libpython3.5m.so.1.0"#13 PyEval_EvalCodeEx in "/usr/lib/libpython3.5m.so.1.0"#14 PyEval_EvalCode in "/usr/lib/libpython3.5m.so.1.0"#15 ? in "/usr/lib/libpython3.5m.so.1.0"#16 PyRun_FileExFlags in "/usr/lib/libpython3.5m.so.1.0"#17 PyRun_SimpleFileExFlags in "/usr/lib/libpython3.5m.so.1.0"#18 Py_Main in "/usr/lib/libpython3.5m.so.1.0"#19 main at ??:?
#20 __libc_start_main in "/usr/lib/libc.so.6"#21 _start at ??:?
./run.sh: line 3: 6828 Floating point exception(core dumped) PYTHONPATH=$(pwd)/pythonFOAM:$PYTHONPATH python test.py
НОТА: Я могу обойти ошибку, запустив это в терминале, прежде чем запустить свой код:
unset FOAM_SIGFPE
Все работает нормально, если я сбросил FOAM_SIGFPE, но это не очень хорошая практика, и настоящая проблема вообще не решена.
Задача ещё не решена.
Других решений пока нет …