mirror of
https://github.com/python/cpython.git
synced 2025-10-01 04:42:10 +00:00
bpo-17799: Explain real behaviour of sys.settrace and sys.setprofile (GH-4056) (#5298)
(cherry picked from commit 131fd7f96c
)
This commit is contained in:
parent
d69794f4df
commit
fd844efa9c
3 changed files with 41 additions and 20 deletions
|
@ -1137,15 +1137,19 @@ Python-level trace functions in previous versions.
|
||||||
function as its first parameter, and may be any Python object, or *NULL*. If
|
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*
|
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
|
for each thread provides a convenient and thread-safe place to store it. The
|
||||||
profile function is called for all monitored events except the line-number
|
profile function is called for all monitored events except :const:`PyTrace_LINE`
|
||||||
events.
|
and :const:`PyTrace_EXCEPTION`.
|
||||||
|
|
||||||
|
|
||||||
.. c:function:: void PyEval_SetTrace(Py_tracefunc func, PyObject *obj)
|
.. c:function:: void PyEval_SetTrace(Py_tracefunc func, PyObject *obj)
|
||||||
|
|
||||||
Set the tracing function to *func*. This is similar to
|
Set the tracing function to *func*. This is similar to
|
||||||
:c:func:`PyEval_SetProfile`, except the tracing function does receive line-number
|
:c:func:`PyEval_SetProfile`, except the tracing function does receive line-number
|
||||||
events.
|
events and does not receive any event related to C function objects being called. Any
|
||||||
|
trace function registered using :c:func:`PyEval_SetTrace` will not receive
|
||||||
|
:const:`PyTrace_C_CALL`, :const:`PyTrace_C_EXCEPTION` or :const:`PyTrace_C_RETURN`
|
||||||
|
as a value for the *what* parameter.
|
||||||
|
|
||||||
|
|
||||||
.. c:function:: PyObject* PyEval_GetCallStats(PyObject *self)
|
.. c:function:: PyObject* PyEval_GetCallStats(PyObject *self)
|
||||||
|
|
||||||
|
|
|
@ -1005,13 +1005,38 @@ always available.
|
||||||
Set the system's profile function, which allows you to implement a Python source
|
Set the system's profile function, which allows you to implement a Python source
|
||||||
code profiler in Python. See chapter :ref:`profile` for more information on the
|
code profiler in Python. See chapter :ref:`profile` for more information on the
|
||||||
Python profiler. The system's profile function is called similarly to the
|
Python profiler. The system's profile function is called similarly to the
|
||||||
system's trace function (see :func:`settrace`), but it isn't called for each
|
system's trace function (see :func:`settrace`), but it is called with different events,
|
||||||
executed line of code (only on call and return, but the return event is reported
|
for example it isn't called for each executed line of code (only on call and return,
|
||||||
even when an exception has been set). The function is thread-specific, but
|
but the return event is reported even when an exception has been set). The function is
|
||||||
there is no way for the profiler to know about context switches between threads,
|
thread-specific, but there is no way for the profiler to know about context switches between
|
||||||
so it does not make sense to use this in the presence of multiple threads. Also,
|
threads, so it does not make sense to use this in the presence of multiple threads. Also,
|
||||||
its return value is not used, so it can simply return ``None``.
|
its return value is not used, so it can simply return ``None``.
|
||||||
|
|
||||||
|
Profile functions should have three arguments: *frame*, *event*, and
|
||||||
|
*arg*. *frame* is the current stack frame. *event* is a string: ``'call'``,
|
||||||
|
``'return'``, ``'c_call'``, ``'c_return'``, or ``'c_exception'``. *arg* depends
|
||||||
|
on the event type.
|
||||||
|
|
||||||
|
The events have the following meaning:
|
||||||
|
|
||||||
|
``'call'``
|
||||||
|
A function is called (or some other code block entered). The
|
||||||
|
profile function is called; *arg* is ``None``.
|
||||||
|
|
||||||
|
``'return'``
|
||||||
|
A function (or other code block) is about to return. The profile
|
||||||
|
function is called; *arg* is the value that will be returned, or ``None``
|
||||||
|
if the event is caused by an exception being raised.
|
||||||
|
|
||||||
|
``'c_call'``
|
||||||
|
A C function is about to be called. This may be an extension function or
|
||||||
|
a built-in. *arg* is the C function object.
|
||||||
|
|
||||||
|
``'c_return'``
|
||||||
|
A C function has returned. *arg* is the C function object.
|
||||||
|
|
||||||
|
``'c_exception'``
|
||||||
|
A C function has raised an exception. *arg* is the C function object.
|
||||||
|
|
||||||
.. function:: setrecursionlimit(limit)
|
.. function:: setrecursionlimit(limit)
|
||||||
|
|
||||||
|
@ -1058,8 +1083,8 @@ always available.
|
||||||
|
|
||||||
Trace functions should have three arguments: *frame*, *event*, and
|
Trace functions should have three arguments: *frame*, *event*, and
|
||||||
*arg*. *frame* is the current stack frame. *event* is a string: ``'call'``,
|
*arg*. *frame* is the current stack frame. *event* is a string: ``'call'``,
|
||||||
``'line'``, ``'return'``, ``'exception'``, ``'c_call'``, ``'c_return'``, or
|
``'line'``, ``'return'`` or ``'exception'``. *arg* depends on
|
||||||
``'c_exception'``. *arg* depends on the event type.
|
the event type.
|
||||||
|
|
||||||
The trace function is invoked (with *event* set to ``'call'``) whenever a new
|
The trace function is invoked (with *event* set to ``'call'``) whenever a new
|
||||||
local scope is entered; it should return a reference to a local trace
|
local scope is entered; it should return a reference to a local trace
|
||||||
|
@ -1094,16 +1119,6 @@ always available.
|
||||||
tuple ``(exception, value, traceback)``; the return value specifies the
|
tuple ``(exception, value, traceback)``; the return value specifies the
|
||||||
new local trace function.
|
new local trace function.
|
||||||
|
|
||||||
``'c_call'``
|
|
||||||
A C function is about to be called. This may be an extension function or
|
|
||||||
a built-in. *arg* is the C function object.
|
|
||||||
|
|
||||||
``'c_return'``
|
|
||||||
A C function has returned. *arg* is the C function object.
|
|
||||||
|
|
||||||
``'c_exception'``
|
|
||||||
A C function has raised an exception. *arg* is the C function object.
|
|
||||||
|
|
||||||
Note that as an exception is propagated down the chain of callers, an
|
Note that as an exception is propagated down the chain of callers, an
|
||||||
``'exception'`` event is generated at each level.
|
``'exception'`` event is generated at each level.
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Explain real behaviour of sys.settrace and sys.setprofile and their C-API counterparts
|
||||||
|
regarding which type of events are received in each function. Patch by Pablo Galindo Salgado.
|
Loading…
Add table
Add a link
Reference in a new issue