71 #define INFPY_REQUIRE_VALID(Inferior) \ 73 if (!Inferior->inferior) \ 75 PyErr_SetString (PyExc_RuntimeError, \ 76 _("Inferior no longer exists.")); \ 84 enum gdb_signal stop_signal;
165 const LONGEST *exit_code = NULL;
172 if (
inf->has_exit_code)
173 exit_code = &
inf->exit_code;
233 Py_INCREF ((PyObject *)inf_obj);
235 return (PyObject *) inf_obj;
321 thread = thread->
next)
382 for (entry = &inf_obj->threads; *entry != NULL; entry =
384 if ((*entry)->thread_obj->thread == tp)
393 *entry = (*entry)->
next;
420 tuple = PyTuple_New (inf_obj->
nthreads);
424 for (i = 0, entry = inf_obj->
threads; i < inf_obj->nthreads;
425 i++, entry = entry->
next)
428 PyTuple_SET_ITEM (tuple, i, (PyObject *) entry->
thread_obj);
441 return PyLong_FromLong (
inf->inferior->num);
451 return PyLong_FromLong (
inf->inferior->
pid);
460 if (
inf->inferior->attach_flag)
468 PyObject *list = (PyObject *) arg;
474 return PyList_Append (list,
inferior.get ()) ? 1 : 0;
489 return PyList_AsTuple (list.
get ());
503 PyObject *addr_obj, *length_obj, *result;
504 static const char *keywords[] = {
"address",
"length", NULL };
507 &addr_obj, &length_obj))
529 if (membuf_obj == NULL)
535 membuf_obj->buffer =
buffer;
536 membuf_obj->addr = addr;
537 membuf_obj->length = length;
540 result = PyMemoryView_FromObject ((PyObject *) membuf_obj.get ());
542 result = PyBuffer_FromReadWriteObject ((PyObject *) membuf_obj.get (), 0,
562 PyObject *addr_obj, *length_obj = NULL;
563 static const char *keywords[] = {
"address",
"buffer",
"length", NULL };
568 &addr_obj, &pybuf, &length_obj))
575 &addr_obj, &
buffer, &buf_len,
601 PyBuffer_Release (&pybuf);
609 PyBuffer_Release (&pybuf);
619 Py_TYPE (
self)->tp_free (
self);
628 return PyString_FromFormat (
_(
"Memory buffer for address %s, \ 629 which is %s bytes long."),
637 get_buffer (PyObject *
self, Py_buffer *buf,
int flags)
642 ret = PyBuffer_FillInfo (buf,
self, membuf_obj->
buffer,
648 buf->format = (
char *)
"c";
662 PyErr_SetString (PyExc_SystemError,
663 _(
"The memory buffer supports only one segment."));
667 *ptrptr = membuf_obj->
buffer;
669 return membuf_obj->
length;
694 *ptrptr = (
char *) ptr;
714 static const char *keywords[] = {
"address",
"length",
"pattern", NULL };
715 PyObject *start_addr_obj, *length_obj;
716 Py_ssize_t pattern_size;
724 &start_addr_obj, &length_obj,
729 pattern_size = pybuf.len;
735 &start_addr_obj, &length_obj,
739 if (!PyObject_CheckReadBuffer (pattern))
741 PyErr_SetString (PyExc_RuntimeError,
742 _(
"The pattern is not a Python buffer."));
747 if (PyObject_AsReadBuffer (pattern, &vbuffer, &pattern_size) == -1)
761 PyErr_SetString (PyExc_ValueError,
762 _(
"Search range is empty."));
767 || (start_addr + length - 1) < start_addr)
769 PyErr_SetString (PyExc_ValueError,
770 _(
"The search range is too large."));
787 PyBuffer_Release (&pybuf);
792 return PyLong_FromLong (found_addr);
798 PyBuffer_Release (&pybuf);
823 PyObject *handle_obj, *result;
825 static const char *keywords[] = {
"thread_handle", NULL };
836 PyErr_SetString (PyExc_TypeError,
837 _(
"Argument 'handle_obj' must be a thread handle object."));
892 inf_obj->inferior = NULL;
895 for (th_entry = inf_obj->threads; th_entry != NULL;)
900 th_entry = th_entry->
next;
904 inf_obj->nthreads = 0;
952 {
"num",
infpy_get_num, NULL,
"ID of inferior, as assigned by GDB.", NULL },
953 {
"pid",
infpy_get_pid, NULL,
"PID of inferior, as assigned by the OS.",
956 "True if the inferior was created using 'attach'.", NULL },
963 "is_valid () -> Boolean.\n\ 964 Return true if this inferior is valid, false if not." },
966 "Return all the threads of this inferior." },
968 METH_VARARGS | METH_KEYWORDS,
969 "read_memory (address, length) -> buffer\n\ 970 Return a buffer object for reading from the inferior's memory." },
972 METH_VARARGS | METH_KEYWORDS,
973 "write_memory (address, buffer [, length])\n\ 974 Write the given buffer object to the inferior's memory." },
976 METH_VARARGS | METH_KEYWORDS,
977 "search_memory (address, length, pattern) -> long\n\ 978 Return a long with the address of a match, or None." },
980 METH_VARARGS | METH_KEYWORDS,
981 "thread_from_thread_handle (handle) -> gdb.InferiorThread.\n\ 982 Return thread object corresponding to thread handle." },
1007 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER,
1008 "GDB inferior object",
1037 #if HAVE_LIBPYTHON2_4 1038 #define CHARBUFFERPROC_NAME getcharbufferproc 1040 #define CHARBUFFERPROC_NAME charbufferproc 1074 "GDB memory buffer object",
struct gdbarch * target_gdbarch(void)
static void python_on_resume(ptid_t ptid)
int gdb_pymodule_addobject(PyObject *module, const char *name, PyObject *object)
static PyObject * infpy_is_valid(PyObject *self, PyObject *args)
struct thread_info * find_thread_ptid(ptid_t ptid)
#define INFPY_REQUIRE_VALID(Inferior)
struct observer * observer_attach_inferior_removed(observer_inferior_removed_ftype *f)
struct observer * observer_attach_thread_exit(observer_thread_exit_ftype *f)
static void python_on_normal_stop(struct bpstats *bs, int print_frame)
static void add_thread_object(struct thread_info *tp)
int ptid_get_pid(const ptid_t &ptid)
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t int int rusage_t pid_t pid
thread_object * create_thread_object(struct thread_info *tp)
static void mbpy_dealloc(PyObject *self)
static PyObject * infpy_threads(PyObject *self, PyObject *args)
struct thread_info * inferior_thread(void)
const struct gdb_exception exception_none
#define CHARBUFFERPROC_NAME
static void python_new_inferior(struct inferior *inf)
PyTypeObject membuf_object_type
struct observer * observer_attach_inferior_exit(observer_inferior_exit_ftype *f)
int emit_clear_objfiles_event(void)
struct inferior * iterate_over_inferiors(int(*callback)(struct inferior *, void *), void *data)
int emit_stop_event(struct bpstats *bs, enum gdb_signal stop_signal)
enum gdb_signal stop_signal
static int gdb_PyArg_ParseTupleAndKeywords(PyObject *args, PyObject *kw, const char *format, const char **keywords,...)
#define PyVarObject_HEAD_INIT(type, size)
int evpy_add_attribute(PyObject *event, const char *name, PyObject *attr)
int emit_inferior_call_event(inferior_call_kind kind, ptid_t thread, CORE_ADDR addr)
PyObject * infpy_thread_from_thread_handle(PyObject *self, PyObject *args, PyObject *kw)
static PyObject * infpy_get_was_attached(PyObject *self, void *closure)
static void python_on_inferior_call_post(ptid_t thread, CORE_ADDR address)
static gdb_PyGetSetDef inferior_object_getset[]
const char * paddress(struct gdbarch *gdbarch, CORE_ADDR addr)
int gdbpy_initialize_inferior(void)
static void py_free_inferior(struct inferior *inf, void *datum)
PyTypeObject inferior_object_type
#define GDB_PY_HANDLE_EXCEPTION(Exception)
mach_port_t kern_return_t mach_port_t msgports mach_port_t kern_return_t pid_t pid mach_port_t kern_return_t mach_port_t task mach_port_t kern_return_t int flags
static void infpy_dealloc(PyObject *obj)
static int build_inferior_list(struct inferior *inf, void *arg)
#define CATCH(EXCEPTION, MASK)
thread_suspend_state suspend
static const struct inferior_data * infpy_inf_data_key
PyObject_HEAD struct inferior * inferior
static Py_ssize_t get_read_buffer(PyObject *self, Py_ssize_t segment, void **ptrptr)
static PyObject * infpy_get_pid(PyObject *self, void *closure)
int emit_exited_event(const LONGEST *exit_code, struct inferior *inf)
PyObject * gdbpy_selected_inferior(PyObject *self, PyObject *args)
thread_info(inferior *inf, ptid_t ptid)
static void python_inferior_deleted(struct inferior *inf)
thread_object * find_thread_object(ptid_t ptid)
int emit_memory_changed_event(CORE_ADDR addr, ssize_t len)
struct gdbarch * get_objfile_arch(const struct objfile *objfile)
char * pulongest(ULONGEST u)
struct inferior * find_inferior_pid(int pid)
struct gdbarch * get_current_arch(void)
struct gdbarch * python_gdbarch
static PyBufferProcs buffer_procs
static PyObject * infpy_read_memory(PyObject *self, PyObject *args, PyObject *kw)
static PyObject * infpy_search_memory(PyObject *self, PyObject *args, PyObject *kw)
struct observer * observer_attach_target_resumed(observer_target_resumed_ftype *f)
int gdb_python_initialized
int emit_register_changed_event(struct frame_info *frame, int regnum)
struct thread_info * find_thread_by_handle(struct value *thread_handle, struct inferior *inf)
static PyMethodDef inferior_object_methods[]
void read_memory(CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
int gdbpy_is_value_object(PyObject *obj)
static void python_on_inferior_call_pre(ptid_t thread, CORE_ADDR address)
PyTypeObject inferior_object_type CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("inferior_object")
int emit_new_objfile_event(struct objfile *objfile)
PyObject_HEAD struct thread_info * thread
events_object gdb_py_events
static void python_on_memory_change(struct inferior *inferior, CORE_ADDR addr, ssize_t len, const bfd_byte *data)
static void print_frame(struct frame_info *frame, int print_level, enum print_what print_what, int print_args, struct symtab_and_line sal)
const struct language_defn * current_language
struct threadlist_entry * next
void update_thread_list(void)
PyObject * find_inferior_object(int pid)
static Py_ssize_t get_seg_count(PyObject *self, Py_ssize_t *lenp)
struct observer * observer_attach_register_changed(observer_register_changed_ftype *f)
int target_search_memory(CORE_ADDR start_addr, ULONGEST search_space_len, const gdb_byte *pattern, ULONGEST pattern_len, CORE_ADDR *found_addrp)
static PyObject * infpy_write_memory(PyObject *self, PyObject *args, PyObject *kw)
struct observer * observer_attach_inferior_call_pre(observer_inferior_call_pre_ftype *f)
void gdbpy_print_stack(void)
static Py_ssize_t get_char_buffer(PyObject *self, Py_ssize_t segment, char **ptrptr)
int emit_continue_event(ptid_t ptid)
int ptid_equal(const ptid_t &ptid1, const ptid_t &ptid2)
struct inferior * current_inferior(void)
static void python_on_register_change(struct frame_info *frame, int regnum)
struct observer * observer_attach_inferior_call_post(observer_inferior_call_post_ftype *f)
gdbpy_ref create_thread_event_object(PyTypeObject *py_type, PyObject *thread=nullptr)
static int ignore(struct target_ops *ops, struct gdbarch *gdbarch, struct bp_target_info *bp_tgt)
static void python_new_objfile(struct objfile *objfile)
gdbpy_ref create_event_object(PyTypeObject *py_type)
struct observer * observer_attach_normal_stop(observer_normal_stop_ftype *f)
struct observer * observer_attach_new_objfile(observer_new_objfile_ftype *f)
int evpy_emit_event(PyObject *event, eventregistry_object *registry)
int get_addr_from_python(PyObject *obj, CORE_ADDR *addr)
PyObject_HEAD void * buffer
struct observer * observer_attach_new_thread(observer_new_thread_ftype *f)
static PyObject * mbpy_str(PyObject *self)
thread_object * thread_obj
struct value * value_object_to_value(PyObject *self)
const struct language_defn * python_language
static PyObject * infpy_get_num(PyObject *self, void *closure)
int evregpy_no_listeners_p(eventregistry_object *registry)
struct observer * observer_attach_inferior_added(observer_inferior_added_ftype *f)
static Py_ssize_t get_write_buffer(PyObject *self, Py_ssize_t segment, void **ptrptr)
void write_memory_with_notification(CORE_ADDR memaddr, const bfd_byte *myaddr, ssize_t len)
PyObject * inferior_to_inferior_object(struct inferior *inferior)
PyObject * gdbpy_inferiors(PyObject *unused, PyObject *unused2)
struct observer * observer_attach_memory_changed(observer_memory_changed_ftype *f)
static void python_inferior_exit(struct inferior *inf)
struct threadlist_entry * threads
static void delete_thread_object(struct thread_info *tp, int ignore)