std :: bad_alloc после замены boost: shell функции python с API Python / C

У меня была функция в C, которую я использовал для расширения python, ранее использующего функцию BOOST_MODULE для выполнения этого. Эта ошибка возникла при переходе на API-интерфейс python-C. Я уверен, что функция run_mymodule работает отлично без этой оболочки.

 static PyObject * wrap_run_mymodule(PyObject *, PyObject *args) { char *file1, *file2, *file3; PyObject *tmpp; if(!PyArg_ParseTuple(args, "sssO", &file1, &file2, &file3, &tmpp)) return NULL; return Py_BuildValue("i", run_mymodule(file1, file2, file3, tmpp)); } static PyMethodDef myModule_methods[] = { {"run_mymodule", (PyCFunction) wrap_run_mymodule, METH_VARARGS}, {NULL, NULL} }; extern "C" void initmymodule(void) { (void) Py_InitModule("mymodule", myModule_methods); } 

объявление функции имеет такую ​​форму: int run_mymodule(char *file1, char *file2, char *file3, PyObject *tmpp)

Вот точное сообщение об ошибке, которое я получаю:

  python(35137,0x7fff76453310) malloc: *** error for object 0x10afcfb78: pointer being freed was not allocated *** set a breakpoint in malloc_error_break to debug Abort trap: 6 

Как я могу решить эту проблему? Где эта ошибка malloc? В python я передаю строки как первые три аргумента, а class python – в качестве четвертого аргумента. Конечно, я счастлив поставить пробники в свой код.

SanderMertens предложил опубликовать вывод valgrind –

 $ valgrind python test_mymodule.py ==30715== Memcheck, a memory error detector ==30715== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. ==30715== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info ==30715== Command: python test_mymodule.py ==30715== ==30715== Syscall param posix_spawn(pid) points to unaddressable byte(s) ==30715== at 0x3D266E: __posix_spawn (in /usr/lib/system/libsystem_kernel.dylib) ==30715== by 0x100001DC2: ??? (in /usr/local/bin/python) ==30715== by 0x25E5FC: start (in /usr/lib/system/libdyld.dylib) ==30715== by 0x1: ??? ==30715== by 0x1000138CF: ??? ==30715== by 0x104803AD1: ??? ==30715== Address 0x0 is not stack'd, malloc'd or (recently) free'd ==30715== Python(30715,0x7fff74a8e310) malloc: *** mach_vm_map(size=140735173898240) failed (error code=3) *** error: can't allocate region *** set a breakpoint in malloc_error_break to debug libc++abi.dylib: terminating with uncaught exception of type std::bad_alloc: std::bad_alloc Abort trap: 6 

Как уже было объяснено в нескольких комментариях, у вас есть проблема с повреждением памяти. Ключевые показатели:

  • Проблема воспроизводится беспорядочно.
  • Точные симптомы изменяются от неожиданных плохих значений, передаваемых в некоторые функции, вплоть до необычно больших сбоев в распределении памяти.
  • Эти симптомы не воспроизводятся для других, когда run_module имеет тривиальную реализацию.

Учитывая, что valgrind не определяет его для вас, это, вероятно, коррупция в стеке. Вы можете искать места, где ваш код вызывает неудачную функцию (от valgrind), и посмотрите, что ваш код сделал до этого, но это будет медленным.

На этом этапе лучше всего использовать инструменты проверки стека. Например, если вы используете gcc, попробуйте использовать параметры дезинфицирующего средства или mudflap (в зависимости от используемой вами версии).