<p>最好通过找出SEGV的根本原因来处理这个问题,因为您的应用程序的状态可能会被触发而严重损坏。你知道吗</p>
<p>如果您想尝试以半结构化的方式捕获SEGV,那么可以使用类似于示例代码的代码,它使用<a href="https://linux.die.net/man/3/sigsetjmp" rel="nofollow noreferrer">^{<cd1>}</a>和<a href="https://linux.die.net/man/3/siglongjmp" rel="nofollow noreferrer">^{<cd2>}</a>:</p>
<pre><code>#include <python3.7m/Python.h> // That's my python
#include <setjmp.h>
#include <signal.h>
static sigjmp_buf env;
static void
catch_segv(int func)
{
siglongjmp(env, 1);
}
int myFunction()
{
PyObject* fExportar = nullptr;
PyObject* modulo = nullptr;
PyObject* pName = nullptr;
const char *scriptDirectoryName = "."; // NOTE: I changed the path for me
Py_InitializeEx(1); // NOTE: skip signal handlers being registered - for embedding
PyObject *sysPath = PySys_GetObject("path");
PyObject *path = PyUnicode_FromString(scriptDirectoryName);
int result = PyList_Insert(sysPath, 0, path);
if (result == 0 )//0 if ok, -1 if error
{
pName = PyUnicode_FromString("beep");//exportarXLS.py
modulo = PyImport_Import(pName);
Py_DECREF(path);
if (modulo)
{
// redirect segv handler here:
sig_t old = signal(SIGSEGV, catch_segv);
// record an environment to return to with siglongjmp
if (sigsetjmp(env, 1)) { // returns 0 on setting up, 1 when called with siglongjmp(env, 1)
// handler called
Py_Finalize();
signal(SIGSEGV, old); // restore old handler
return 1; // return to caller
} else {
// this triggers a segv (for the test)
(reinterpret_cast<sig_t>(0))(1);
fExportar = PyObject_GetAttrString(modulo, "beep");//it crahs here
Py_DECREF(modulo);
if (fExportar)
{
//call the function
}
}
signal(SIGSEGV, old); // restore old handler
}
}
else
{
PyErr_Print();
}
Py_Finalize();
return 0; // return success.
}
int main(int argc, char **argv)
{
return myFunction();
}
</code></pre>