cpython/Modules/_remote_debugging/interpreters.c

66 lines
2.4 KiB
C

/******************************************************************************
* Remote Debugging Module - Interpreters Functions
*
* This file contains function for iterating interpreters.
******************************************************************************/
#include "_remote_debugging.h"
int
iterate_interpreters(
RuntimeOffsets *offsets,
interpreter_processor_func processor,
void *context
) {
uintptr_t interpreters_head_addr =
offsets->runtime_start_address
+ (uintptr_t)offsets->debug_offsets.runtime_state.interpreters_head;
uintptr_t interpreter_id_offset =
(uintptr_t)offsets->debug_offsets.interpreter_state.id;
uintptr_t interpreter_next_offset =
(uintptr_t)offsets->debug_offsets.interpreter_state.next;
uintptr_t interpreter_state_addr;
if (_Py_RemoteDebug_ReadRemoteMemory(&offsets->handle,
interpreters_head_addr,
sizeof(void*),
&interpreter_state_addr) < 0) {
set_exception_cause(offsets, PyExc_RuntimeError, "Failed to read interpreter state address");
return -1;
}
if (interpreter_state_addr == 0) {
PyErr_SetString(PyExc_RuntimeError, "No interpreter state found");
return -1;
}
int64_t iid = 0;
static_assert(
sizeof((((PyInterpreterState*)NULL)->id)) == sizeof(iid),
"Sizeof of PyInterpreterState.id mismatch with local iid value");
while (interpreter_state_addr != 0) {
if (_Py_RemoteDebug_ReadRemoteMemory(
&offsets->handle,
interpreter_state_addr + interpreter_id_offset,
sizeof(iid),
&iid) < 0) {
set_exception_cause(offsets, PyExc_RuntimeError, "Failed to read interpreter id");
return -1;
}
if (processor(offsets, interpreter_state_addr, iid, context) < 0) {
return -1;
}
if (_Py_RemoteDebug_ReadRemoteMemory(
&offsets->handle,
interpreter_state_addr + interpreter_next_offset,
sizeof(void*),
&interpreter_state_addr) < 0) {
set_exception_cause(offsets, PyExc_RuntimeError, "Failed to read next interpreter state");
return -1;
}
}
return 0;
}