mirror of
https://github.com/python/cpython.git
synced 2025-12-23 09:19:18 +00:00
gh-138122: Make the tachyon profiler opcode-aware (#142394)
This commit is contained in:
parent
fa448451ab
commit
5b19c75b47
36 changed files with 3983 additions and 507 deletions
|
|
@ -28,11 +28,28 @@ PyStructSequence_Desc TaskInfo_desc = {
|
|||
4
|
||||
};
|
||||
|
||||
// LocationInfo structseq type
|
||||
static PyStructSequence_Field LocationInfo_fields[] = {
|
||||
{"lineno", "Line number"},
|
||||
{"end_lineno", "End line number"},
|
||||
{"col_offset", "Column offset"},
|
||||
{"end_col_offset", "End column offset"},
|
||||
{NULL}
|
||||
};
|
||||
|
||||
PyStructSequence_Desc LocationInfo_desc = {
|
||||
"_remote_debugging.LocationInfo",
|
||||
"Source location information: (lineno, end_lineno, col_offset, end_col_offset)",
|
||||
LocationInfo_fields,
|
||||
4
|
||||
};
|
||||
|
||||
// FrameInfo structseq type
|
||||
static PyStructSequence_Field FrameInfo_fields[] = {
|
||||
{"filename", "Source code filename"},
|
||||
{"lineno", "Line number"},
|
||||
{"location", "LocationInfo structseq or None for synthetic frames"},
|
||||
{"funcname", "Function name"},
|
||||
{"opcode", "Opcode being executed (None if not gathered)"},
|
||||
{NULL}
|
||||
};
|
||||
|
||||
|
|
@ -40,7 +57,7 @@ PyStructSequence_Desc FrameInfo_desc = {
|
|||
"_remote_debugging.FrameInfo",
|
||||
"Information about a frame",
|
||||
FrameInfo_fields,
|
||||
3
|
||||
4
|
||||
};
|
||||
|
||||
// CoroInfo structseq type
|
||||
|
|
@ -235,6 +252,7 @@ _remote_debugging.RemoteUnwinder.__init__
|
|||
skip_non_matching_threads: bool = True
|
||||
native: bool = False
|
||||
gc: bool = False
|
||||
opcodes: bool = False
|
||||
cache_frames: bool = False
|
||||
stats: bool = False
|
||||
|
||||
|
|
@ -255,6 +273,8 @@ Args:
|
|||
non-Python code.
|
||||
gc: If True, include artificial "<GC>" frames to denote active garbage
|
||||
collection.
|
||||
opcodes: If True, gather bytecode opcode information for instruction-level
|
||||
profiling.
|
||||
cache_frames: If True, enable frame caching optimization to avoid re-reading
|
||||
unchanged parent frames between samples.
|
||||
stats: If True, collect statistics about cache hits, memory reads, etc.
|
||||
|
|
@ -277,8 +297,9 @@ _remote_debugging_RemoteUnwinder___init___impl(RemoteUnwinderObject *self,
|
|||
int mode, int debug,
|
||||
int skip_non_matching_threads,
|
||||
int native, int gc,
|
||||
int cache_frames, int stats)
|
||||
/*[clinic end generated code: output=b34ef8cce013c975 input=df2221ef114c3d6a]*/
|
||||
int opcodes, int cache_frames,
|
||||
int stats)
|
||||
/*[clinic end generated code: output=0031f743f4b9ad52 input=8fb61b24102dec6e]*/
|
||||
{
|
||||
// Validate that all_threads and only_active_thread are not both True
|
||||
if (all_threads && only_active_thread) {
|
||||
|
|
@ -297,6 +318,7 @@ _remote_debugging_RemoteUnwinder___init___impl(RemoteUnwinderObject *self,
|
|||
|
||||
self->native = native;
|
||||
self->gc = gc;
|
||||
self->opcodes = opcodes;
|
||||
self->cache_frames = cache_frames;
|
||||
self->collect_stats = stats;
|
||||
self->stale_invalidation_counter = 0;
|
||||
|
|
@ -978,6 +1000,14 @@ _remote_debugging_exec(PyObject *m)
|
|||
return -1;
|
||||
}
|
||||
|
||||
st->LocationInfo_Type = PyStructSequence_NewType(&LocationInfo_desc);
|
||||
if (st->LocationInfo_Type == NULL) {
|
||||
return -1;
|
||||
}
|
||||
if (PyModule_AddType(m, st->LocationInfo_Type) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
st->FrameInfo_Type = PyStructSequence_NewType(&FrameInfo_desc);
|
||||
if (st->FrameInfo_Type == NULL) {
|
||||
return -1;
|
||||
|
|
@ -1051,6 +1081,7 @@ remote_debugging_traverse(PyObject *mod, visitproc visit, void *arg)
|
|||
RemoteDebuggingState *state = RemoteDebugging_GetState(mod);
|
||||
Py_VISIT(state->RemoteDebugging_Type);
|
||||
Py_VISIT(state->TaskInfo_Type);
|
||||
Py_VISIT(state->LocationInfo_Type);
|
||||
Py_VISIT(state->FrameInfo_Type);
|
||||
Py_VISIT(state->CoroInfo_Type);
|
||||
Py_VISIT(state->ThreadInfo_Type);
|
||||
|
|
@ -1065,6 +1096,7 @@ remote_debugging_clear(PyObject *mod)
|
|||
RemoteDebuggingState *state = RemoteDebugging_GetState(mod);
|
||||
Py_CLEAR(state->RemoteDebugging_Type);
|
||||
Py_CLEAR(state->TaskInfo_Type);
|
||||
Py_CLEAR(state->LocationInfo_Type);
|
||||
Py_CLEAR(state->FrameInfo_Type);
|
||||
Py_CLEAR(state->CoroInfo_Type);
|
||||
Py_CLEAR(state->ThreadInfo_Type);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue