Python: include Python stack trace in the crash log
This helps Python developers troubleshoot errors when Python causes a crash.
This commit is contained in:
@@ -55,6 +55,7 @@ void BPY_python_start(int argc, const char **argv);
|
|||||||
void BPY_python_end(void);
|
void BPY_python_end(void);
|
||||||
void BPY_python_reset(struct bContext *C);
|
void BPY_python_reset(struct bContext *C);
|
||||||
void BPY_python_use_system_env(void);
|
void BPY_python_use_system_env(void);
|
||||||
|
void BPY_python_backtrace(FILE *file);
|
||||||
|
|
||||||
/* global interpreter lock */
|
/* global interpreter lock */
|
||||||
|
|
||||||
|
|||||||
@@ -360,6 +360,20 @@ void PyC_StackSpit(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PyC_StackPrint(FILE *fp)
|
||||||
|
{
|
||||||
|
PyThreadState *tstate = PyGILState_GetThisThreadState();
|
||||||
|
if (tstate != NULL && tstate->frame != NULL) {
|
||||||
|
PyFrameObject *frame = tstate->frame;
|
||||||
|
do {
|
||||||
|
const int line = PyCode_Addr2Line(frame->f_code, frame->f_lasti);
|
||||||
|
const char *filename = _PyUnicode_AsString(frame->f_code->co_filename);
|
||||||
|
const char *funcname = _PyUnicode_AsString(frame->f_code->co_name);
|
||||||
|
fprintf(fp, " File \"%s\", line %d in %s\n", filename, line, funcname);
|
||||||
|
} while ((frame = frame->f_back));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void PyC_FileAndNum(const char **r_filename, int *r_lineno)
|
void PyC_FileAndNum(const char **r_filename, int *r_lineno)
|
||||||
{
|
{
|
||||||
PyFrameObject *frame;
|
PyFrameObject *frame;
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ void PyC_ObSpit(const char *name, PyObject *var);
|
|||||||
void PyC_ObSpitStr(char *result, size_t result_len, PyObject *var);
|
void PyC_ObSpitStr(char *result, size_t result_len, PyObject *var);
|
||||||
void PyC_LineSpit(void);
|
void PyC_LineSpit(void);
|
||||||
void PyC_StackSpit(void);
|
void PyC_StackSpit(void);
|
||||||
|
void PyC_StackPrint(FILE *fp);
|
||||||
PyObject *PyC_ExceptionBuffer(void);
|
PyObject *PyC_ExceptionBuffer(void);
|
||||||
PyObject *PyC_ExceptionBuffer_Simple(void);
|
PyObject *PyC_ExceptionBuffer_Simple(void);
|
||||||
PyObject *PyC_Object_GetAttrStringArgs(PyObject *o, Py_ssize_t n, ...);
|
PyObject *PyC_Object_GetAttrStringArgs(PyObject *o, Py_ssize_t n, ...);
|
||||||
|
|||||||
@@ -436,6 +436,12 @@ static void python_script_error_jump_text(struct Text *text)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BPY_python_backtrace(FILE *fp)
|
||||||
|
{
|
||||||
|
fputs("\n# Python backtrace\n", fp);
|
||||||
|
PyC_StackPrint(fp);
|
||||||
|
}
|
||||||
|
|
||||||
/* super annoying, undo _PyModule_Clear(), bug [#23871] */
|
/* super annoying, undo _PyModule_Clear(), bug [#23871] */
|
||||||
#define PYMODULE_CLEAR_WORKAROUND
|
#define PYMODULE_CLEAR_WORKAROUND
|
||||||
|
|
||||||
|
|||||||
@@ -59,6 +59,10 @@
|
|||||||
|
|
||||||
# include <signal.h>
|
# include <signal.h>
|
||||||
|
|
||||||
|
# ifdef WITH_PYTHON
|
||||||
|
# include "BPY_extern.h" /* BPY_python_backtrace */
|
||||||
|
# endif
|
||||||
|
|
||||||
# include "creator_intern.h" /* own include */
|
# include "creator_intern.h" /* own include */
|
||||||
|
|
||||||
// #define USE_WRITE_CRASH_BLEND
|
// #define USE_WRITE_CRASH_BLEND
|
||||||
@@ -174,6 +178,11 @@ static void sig_handle_crash(int signum)
|
|||||||
|
|
||||||
sig_handle_crash_backtrace(fp);
|
sig_handle_crash_backtrace(fp);
|
||||||
|
|
||||||
|
# ifdef WITH_PYTHON
|
||||||
|
/* Generate python back-trace if Python is currently active. */
|
||||||
|
BPY_python_backtrace(fp);
|
||||||
|
# endif
|
||||||
|
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user