gh-106597: Add debugging struct with offsets for out-of-process tools (#106598)

This commit is contained in:
Pablo Galindo Salgado 2023-07-11 20:35:41 +01:00 committed by GitHub
parent 579aa89e68
commit b444bfb0a3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 151 additions and 1 deletions

View file

@ -53,12 +53,101 @@ typedef struct _Py_AuditHookEntry {
void *userData;
} _Py_AuditHookEntry;
typedef struct _Py_DebugOffsets {
char cookie[8];
uint64_t version;
// Runtime state offset;
struct _runtime_state {
off_t finalizing;
off_t interpreters_head;
} runtime_state;
// Interpreter state offset;
struct _interpreter_state {
off_t next;
off_t threads_head;
off_t gc;
off_t imports_modules;
off_t sysdict;
off_t builtins;
off_t ceval_gil;
off_t gil_runtime_state_locked;
off_t gil_runtime_state_holder;
} interpreter_state;
// Thread state offset;
struct _thread_state{
off_t prev;
off_t next;
off_t interp;
off_t cframe;
off_t thread_id;
off_t native_thread_id;
} thread_state;
// InterpreterFrame offset;
struct _interpreter_frame {
off_t previous;
off_t executable;
off_t prev_instr;
off_t localsplus;
off_t owner;
} interpreter_frame;
// CFrame offset;
struct _cframe {
off_t current_frame;
off_t previous;
} cframe;
// Code object offset;
struct _code_object {
off_t filename;
off_t name;
off_t linetable;
off_t firstlineno;
off_t argcount;
off_t localsplusnames;
off_t localspluskinds;
off_t co_code_adaptive;
} code_object;
// PyObject offset;
struct _pyobject {
off_t ob_type;
} pyobject;
// PyTypeObject object offset;
struct _type_object {
off_t tp_name;
} type_object;
// PyTuple object offset;
struct _tuple_object {
off_t ob_item;
} tuple_object;
} _Py_DebugOffsets;
/* Full Python runtime state */
/* _PyRuntimeState holds the global state for the CPython runtime.
That data is exposed in the internal API as a static variable (_PyRuntime).
*/
typedef struct pyruntimestate {
/* This field must be first to facilitate locating it by out of process
* debuggers. Out of process debuggers will use the offsets contained in this
* field to be able to locate other fields in several interpreter structures
* in a way that doesn't require them to know the exact layout of those
* structures.
*
* IMPORTANT:
* This struct is **NOT** backwards compatible between minor version of the
* interpreter and the members, order of members and size can change between
* minor versions. This struct is only guaranteed to be stable between patch
* versions for a given minor version of the interpreter.
*/
_Py_DebugOffsets debug_offsets;
/* Has been initialized to a safe state.
In order to be effective, this must be set to 0 during or right