分析和跟踪
The Python interpreter provides some low-level support for attaching profiling and execution tracing facilities. These are used for profiling, debugging, and coverage analysis tools.
This C interface allows the profiling or tracing code to avoid the overhead of calling through Python-level callable objects, making a direct C function call instead. The essential attributes of the facility have not changed; the interface allows trace functions to be installed per-thread, and the basic events reported to the trace function are the same as had been reported to the Python-level trace functions in previous versions.
int (*Py_tracefunc)
(PyObject obj*, PyFrameObject frame, int what, PyObject **arg)
The type of the trace function registered using PyEval_SetProfile()
and PyEval_SetTrace()
. The first parameter is the object passed to the registration function as obj, frame is the frame object to which the event pertains, what is one of the constants PyTrace_CALL
, PyTrace_EXCEPTION
, PyTrace_LINE
, PyTrace_RETURN
, PyTrace_C_CALL
, PyTrace_C_EXCEPTION
, PyTrace_C_RETURN
, or PyTrace_OPCODE
, and arg depends on the value of what:
what 的值 | arg 的含义 |
---|---|
| 总是 |
|
|
| 总是 |
| Value being returned to the caller, or |
| 正在调用函数对象。 |
| 正在调用函数对象。 |
| 正在调用函数对象。 |
| 总是 |
int PyTrace_CALL
The value of the what parameter to a Py_tracefunc
function when a new call to a function or method is being reported, or a new entry into a generator. Note that the creation of the iterator for a generator function is not reported as there is no control transfer to the Python bytecode in the corresponding frame.
int PyTrace_EXCEPTION
The value of the what parameter to a Py_tracefunc
function when an exception has been raised. The callback function is called with this value for what when after any bytecode is processed after which the exception becomes set within the frame being executed. The effect of this is that as exception propagation causes the Python stack to unwind, the callback is called upon return to each frame as the exception propagates. Only trace functions receives these events; they are not needed by the profiler.
int PyTrace_LINE
The value passed as the what parameter to a Py_tracefunc
function (but not a profiling function) when a line-number event is being reported. It may be disabled for a frame by setting f_trace_lines
to 0 on that frame.
int PyTrace_RETURN
The value for the what parameter to Py_tracefunc
functions when a call is about to return.
int PyTrace_C_CALL
The value for the what parameter to Py_tracefunc
functions when a C function is about to be called.
int PyTrace_C_EXCEPTION
The value for the what parameter to Py_tracefunc
functions when a C function has raised an exception.
int PyTrace_C_RETURN
The value for the what parameter to Py_tracefunc
functions when a C function has returned.
int PyTrace_OPCODE
The value for the what parameter to Py_tracefunc
functions (but not profiling functions) when a new opcode is about to be executed. This event is not emitted by default: it must be explicitly requested by setting f_trace_opcodes
to 1 on the frame.
void PyEval_SetProfile
(Py_tracefunc func, PyObject *obj)
Set the profiler function to func. The obj parameter is passed to the function as its first parameter, and may be any Python object, or NULL
. If the profile function needs to maintain state, using a different value for obj for each thread provides a convenient and thread-safe place to store it. The profile function is called for all monitored events except PyTrace_LINE
PyTrace_OPCODE
and PyTrace_EXCEPTION
.
The caller must hold the GIL.
void PyEval_SetTrace
(Py_tracefunc func, PyObject *obj)
Set the tracing function to func. This is similar to PyEval_SetProfile()
, except the tracing function does receive line-number events and per-opcode events, but does not receive any event related to C function objects being called. Any trace function registered using PyEval_SetTrace()
will not receive PyTrace_C_CALL
, PyTrace_C_EXCEPTION
or PyTrace_C_RETURN
as a value for the what parameter.
The caller must hold the GIL.