diff options
| author | Pablo Galindo Salgado <Pablogsal@gmail.com> | 2025-12-11 03:41:47 (GMT) |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-12-11 03:41:47 (GMT) |
| commit | 5b19c75b47eb86fbc77b46199869f873d51d5fbb (patch) | |
| tree | 2bd34de6dd1658c586924a94a4fb6b37cc0fdb75 /Modules/_remote_debugging/module.c | |
| parent | fa448451abfabe7dbc969ef6468bedc4a8b8ecaf (diff) | |
| download | cpython-5b19c75b47eb86fbc77b46199869f873d51d5fbb.zip cpython-5b19c75b47eb86fbc77b46199869f873d51d5fbb.tar.gz cpython-5b19c75b47eb86fbc77b46199869f873d51d5fbb.tar.bz2 | |
gh-138122: Make the tachyon profiler opcode-aware (#142394)
Diffstat (limited to 'Modules/_remote_debugging/module.c')
| -rw-r--r-- | Modules/_remote_debugging/module.c | 40 |
1 files changed, 36 insertions, 4 deletions
diff --git a/Modules/_remote_debugging/module.c b/Modules/_remote_debugging/module.c index 123e4f5..9b05b91 100644 --- a/Modules/_remote_debugging/module.c +++ b/Modules/_remote_debugging/module.c @@ -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); |
