Успех ! MSVC переходит к моему API-коду после того, как MATLAB вызывает точку останова. Точка останова срабатывает здесь:
PyObject *module = PyModule_Create(&moduledef);
, где
static struct PyModuleDef moduledef =
{
PyModuleDef_HEAD_INIT,
"my_pylib",
NULL,
sizeof(struct module_state),
my_pylib_methods,
NULL,
my_pylib_traverse,
my_pylib_clear,
NULL
};
После загрузки исходного кода Python 3.7 я могу копнуть немного глубже. Вызов PyModule_Create
- это оболочка, которая вызывает следующую функцию в Objects/moduleobject.c
:
PyObject *
PyModule_Create2(struct PyModuleDef* module, int module_api_version)
{
if (!_PyImport_IsInitialized(PyThreadState_GET()->interp))
Py_FatalError("Python import machinery not initialized");
return _PyModule_CreateInitialized(module, module_api_version);
}
где точка останова находится внутри предложения if()
. Это означает, что moduledef
даже не имеет значения. _PyImport_IsInitialized()
- это функция в Python/import.c
:
int
_PyImport_IsInitialized(PyInterpreterState *interp)
{
if (interp->modules == NULL)
return 0;
return 1;
}
, что, по-видимому, не является вероятным кандидатом, который может стать причиной моего нарушения прав доступа®. Переход к PyThreadState_GET()
наконец заставил меня осознать: я фактически отлаживаю API Python / C ++ вместо своего кода ...