| .. highlight:: c | |
| .. _profiling: | |
| Profiling and tracing | |
| ===================== | |
| 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. | |
| .. c:type:: int (*Py_tracefunc)(PyObject *obj, PyFrameObject *frame, int what, PyObject *arg) | |
| The type of the trace function registered using :c:func:`PyEval_SetProfile` and | |
| :c:func:`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 :c:data:`PyTrace_CALL`, | |
| :c:data:`PyTrace_EXCEPTION`, :c:data:`PyTrace_LINE`, :c:data:`PyTrace_RETURN`, | |
| :c:data:`PyTrace_C_CALL`, :c:data:`PyTrace_C_EXCEPTION`, :c:data:`PyTrace_C_RETURN`, | |
| or :c:data:`PyTrace_OPCODE`, and *arg* depends on the value of *what*: | |
| +-------------------------------+----------------------------------------+ | |
| | Value of *what* | Meaning of *arg* | | |
| +===============================+========================================+ | |
| | :c:data:`PyTrace_CALL` | Always :c:data:`Py_None`. | | |
| +-------------------------------+----------------------------------------+ | |
| | :c:data:`PyTrace_EXCEPTION` | Exception information as returned by | | |
| | | :func:`sys.exc_info`. | | |
| +-------------------------------+----------------------------------------+ | |
| | :c:data:`PyTrace_LINE` | Always :c:data:`Py_None`. | | |
| +-------------------------------+----------------------------------------+ | |
| | :c:data:`PyTrace_RETURN` | Value being returned to the caller, | | |
| | | or ``NULL`` if caused by an exception. | | |
| +-------------------------------+----------------------------------------+ | |
| | :c:data:`PyTrace_C_CALL` | Function object being called. | | |
| +-------------------------------+----------------------------------------+ | |
| | :c:data:`PyTrace_C_EXCEPTION` | Function object being called. | | |
| +-------------------------------+----------------------------------------+ | |
| | :c:data:`PyTrace_C_RETURN` | Function object being called. | | |
| +-------------------------------+----------------------------------------+ | |
| | :c:data:`PyTrace_OPCODE` | Always :c:data:`Py_None`. | | |
| +-------------------------------+----------------------------------------+ | |
| .. c:var:: int PyTrace_CALL | |
| The value of the *what* parameter to a :c:type:`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. | |
| .. c:var:: int PyTrace_EXCEPTION | |
| The value of the *what* parameter to a :c:type:`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 receive | |
| these events; they are not needed by the profiler. | |
| .. c:var:: int PyTrace_LINE | |
| The value passed as the *what* parameter to a :c:type:`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 :attr:`~frame.f_trace_lines` to | |
| *0* on that frame. | |
| .. c:var:: int PyTrace_RETURN | |
| The value for the *what* parameter to :c:type:`Py_tracefunc` functions when a | |
| call is about to return. | |
| .. c:var:: int PyTrace_C_CALL | |
| The value for the *what* parameter to :c:type:`Py_tracefunc` functions when a C | |
| function is about to be called. | |
| .. c:var:: int PyTrace_C_EXCEPTION | |
| The value for the *what* parameter to :c:type:`Py_tracefunc` functions when a C | |
| function has raised an exception. | |
| .. c:var:: int PyTrace_C_RETURN | |
| The value for the *what* parameter to :c:type:`Py_tracefunc` functions when a C | |
| function has returned. | |
| .. c:var:: int PyTrace_OPCODE | |
| The value for the *what* parameter to :c:type:`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 | |
| :attr:`~frame.f_trace_opcodes` to *1* on the frame. | |
| .. c:function:: 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 :c:data:`PyTrace_LINE` | |
| :c:data:`PyTrace_OPCODE` and :c:data:`PyTrace_EXCEPTION`. | |
| See also the :func:`sys.setprofile` function. | |
| The caller must have an :term:`attached thread state`. | |
| .. c:function:: void PyEval_SetProfileAllThreads(Py_tracefunc func, PyObject *obj) | |
| Like :c:func:`PyEval_SetProfile` but sets the profile function in all running threads | |
| belonging to the current interpreter instead of the setting it only on the current thread. | |
| The caller must have an :term:`attached thread state`. | |
| As :c:func:`PyEval_SetProfile`, this function ignores any exceptions raised while | |
| setting the profile functions in all threads. | |
| .. versionadded:: 3.12 | |
| .. c:function:: void PyEval_SetTrace(Py_tracefunc func, PyObject *obj) | |
| Set the tracing function to *func*. This is similar to | |
| :c:func:`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 :c:func:`PyEval_SetTrace` | |
| will not receive :c:data:`PyTrace_C_CALL`, :c:data:`PyTrace_C_EXCEPTION` or | |
| :c:data:`PyTrace_C_RETURN` as a value for the *what* parameter. | |
| See also the :func:`sys.settrace` function. | |
| The caller must have an :term:`attached thread state`. | |
| .. c:function:: void PyEval_SetTraceAllThreads(Py_tracefunc func, PyObject *obj) | |
| Like :c:func:`PyEval_SetTrace` but sets the tracing function in all running threads | |
| belonging to the current interpreter instead of the setting it only on the current thread. | |
| The caller must have an :term:`attached thread state`. | |
| As :c:func:`PyEval_SetTrace`, this function ignores any exceptions raised while | |
| setting the trace functions in all threads. | |
| .. versionadded:: 3.12 | |
| Reference tracing | |
| ================= | |
| .. versionadded:: 3.13 | |
| .. c:type:: int (*PyRefTracer)(PyObject *, int event, void* data) | |
| The type of the trace function registered using :c:func:`PyRefTracer_SetTracer`. | |
| The first parameter is a Python object that has been just created (when **event** | |
| is set to :c:data:`PyRefTracer_CREATE`) or about to be destroyed (when **event** | |
| is set to :c:data:`PyRefTracer_DESTROY`). The **data** argument is the opaque pointer | |
| that was provided when :c:func:`PyRefTracer_SetTracer` was called. | |
| If a new tracing function is registered replacing the current one, a call to the | |
| trace function will be made with the object set to **NULL** and **event** set to | |
| :c:data:`PyRefTracer_TRACKER_REMOVED`. This will happen just before the new | |
| function is registered. | |
| .. versionadded:: 3.13 | |
| .. c:var:: int PyRefTracer_CREATE | |
| The value for the *event* parameter to :c:type:`PyRefTracer` functions when a Python | |
| object has been created. | |
| .. c:var:: int PyRefTracer_DESTROY | |
| The value for the *event* parameter to :c:type:`PyRefTracer` functions when a Python | |
| object has been destroyed. | |
| .. c:var:: int PyRefTracer_TRACKER_REMOVED | |
| The value for the *event* parameter to :c:type:`PyRefTracer` functions when the | |
| current tracer is about to be replaced by a new one. | |
| .. versionadded:: 3.14 | |
| .. c:function:: int PyRefTracer_SetTracer(PyRefTracer tracer, void *data) | |
| Register a reference tracer function. The function will be called when a new | |
| Python object has been created or when an object is going to be destroyed. If | |
| **data** is provided it must be an opaque pointer that will be provided when | |
| the tracer function is called. Return ``0`` on success. Set an exception and | |
| return ``-1`` on error. | |
| Note that tracer functions **must not** create Python objects inside or | |
| otherwise the call will be re-entrant. The tracer also **must not** clear | |
| any existing exception or set an exception. A :term:`thread state` will be active | |
| every time the tracer function is called. | |
| There must be an :term:`attached thread state` when calling this function. | |
| If another tracer function was already registered, the old function will be | |
| called with **event** set to :c:data:`PyRefTracer_TRACKER_REMOVED` just before | |
| the new function is registered. | |
| .. versionadded:: 3.13 | |
| .. c:function:: PyRefTracer PyRefTracer_GetTracer(void** data) | |
| Get the registered reference tracer function and the value of the opaque data | |
| pointer that was registered when :c:func:`PyRefTracer_SetTracer` was called. | |
| If no tracer was registered this function will return NULL and will set the | |
| **data** pointer to NULL. | |
| There must be an :term:`attached thread state` when calling this function. | |
| .. versionadded:: 3.13 |