1 /* Python interface to inferiors.
3 Copyright (C) 2009-2014 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
22 #include "gdbthread.h"
26 #include "python-internal.h"
27 #include "arch-utils.h"
29 #include "gdb_signals.h"
31 #include "py-stopevent.h"
33 struct threadlist_entry
{
34 thread_object
*thread_obj
;
35 struct threadlist_entry
*next
;
42 /* The inferior we represent. */
43 struct inferior
*inferior
;
45 /* thread_object instances under this inferior. This list owns a
46 reference to each object it contains. */
47 struct threadlist_entry
*threads
;
49 /* Number of threads in the list. */
53 static PyTypeObject inferior_object_type
54 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("inferior_object");
56 static const struct inferior_data
*infpy_inf_data_key
;
62 /* These are kept just for mbpy_str. */
67 static PyTypeObject membuf_object_type
68 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("membuf_object");
70 /* Require that INFERIOR be a valid inferior ID. */
71 #define INFPY_REQUIRE_VALID(Inferior) \
73 if (!Inferior->inferior) \
75 PyErr_SetString (PyExc_RuntimeError, \
76 _("Inferior no longer exists.")); \
82 python_on_normal_stop (struct bpstats
*bs
, int print_frame
)
84 struct cleanup
*cleanup
;
85 enum gdb_signal stop_signal
;
87 if (!gdb_python_initialized
)
90 if (!find_thread_ptid (inferior_ptid
))
93 stop_signal
= inferior_thread ()->suspend
.stop_signal
;
95 cleanup
= ensure_python_env (get_current_arch (), current_language
);
97 if (emit_stop_event (bs
, stop_signal
) < 0)
100 do_cleanups (cleanup
);
104 python_on_resume (ptid_t ptid
)
106 struct cleanup
*cleanup
;
108 if (!gdb_python_initialized
)
111 cleanup
= ensure_python_env (target_gdbarch (), current_language
);
113 if (emit_continue_event (ptid
) < 0)
114 gdbpy_print_stack ();
116 do_cleanups (cleanup
);
120 python_inferior_exit (struct inferior
*inf
)
122 struct cleanup
*cleanup
;
123 const LONGEST
*exit_code
= NULL
;
125 if (!gdb_python_initialized
)
128 cleanup
= ensure_python_env (target_gdbarch (), current_language
);
130 if (inf
->has_exit_code
)
131 exit_code
= &inf
->exit_code
;
133 if (emit_exited_event (exit_code
, inf
) < 0)
134 gdbpy_print_stack ();
136 do_cleanups (cleanup
);
139 /* Callback used to notify Python listeners about new objfiles loaded in the
140 inferior. OBJFILE may be NULL which means that the objfile list has been
141 cleared (emptied). */
144 python_new_objfile (struct objfile
*objfile
)
146 struct cleanup
*cleanup
;
148 if (!gdb_python_initialized
)
151 cleanup
= ensure_python_env (objfile
!= NULL
152 ? get_objfile_arch (objfile
)
158 if (emit_clear_objfiles_event () < 0)
159 gdbpy_print_stack ();
163 if (emit_new_objfile_event (objfile
) < 0)
164 gdbpy_print_stack ();
167 do_cleanups (cleanup
);
170 /* Return a reference to the Python object of type Inferior
171 representing INFERIOR. If the object has already been created,
172 return it and increment the reference count, otherwise, create it.
173 Return NULL on failure. */
175 inferior_to_inferior_object (struct inferior
*inferior
)
177 inferior_object
*inf_obj
;
179 inf_obj
= inferior_data (inferior
, infpy_inf_data_key
);
182 inf_obj
= PyObject_New (inferior_object
, &inferior_object_type
);
186 inf_obj
->inferior
= inferior
;
187 inf_obj
->threads
= NULL
;
188 inf_obj
->nthreads
= 0;
190 set_inferior_data (inferior
, infpy_inf_data_key
, inf_obj
);
194 Py_INCREF ((PyObject
*)inf_obj
);
196 return (PyObject
*) inf_obj
;
199 /* Finds the Python Inferior object for the given PID. Returns a
200 reference, or NULL if PID does not match any inferior object. */
203 find_inferior_object (int pid
)
205 struct inferior
*inf
= find_inferior_pid (pid
);
208 return inferior_to_inferior_object (inf
);
214 find_thread_object (ptid_t ptid
)
217 struct threadlist_entry
*thread
;
219 thread_object
*found
= NULL
;
221 pid
= ptid_get_pid (ptid
);
225 inf_obj
= find_inferior_object (pid
);
230 for (thread
= ((inferior_object
*)inf_obj
)->threads
; thread
;
231 thread
= thread
->next
)
232 if (ptid_equal (thread
->thread_obj
->thread
->ptid
, ptid
))
234 found
= thread
->thread_obj
;
247 add_thread_object (struct thread_info
*tp
)
249 struct cleanup
*cleanup
;
250 thread_object
*thread_obj
;
251 inferior_object
*inf_obj
;
252 struct threadlist_entry
*entry
;
254 if (!gdb_python_initialized
)
257 cleanup
= ensure_python_env (python_gdbarch
, python_language
);
259 thread_obj
= create_thread_object (tp
);
262 gdbpy_print_stack ();
263 do_cleanups (cleanup
);
267 inf_obj
= (inferior_object
*) thread_obj
->inf_obj
;
269 entry
= xmalloc (sizeof (struct threadlist_entry
));
270 entry
->thread_obj
= thread_obj
;
271 entry
->next
= inf_obj
->threads
;
273 inf_obj
->threads
= entry
;
276 do_cleanups (cleanup
);
280 delete_thread_object (struct thread_info
*tp
, int ignore
)
282 struct cleanup
*cleanup
;
283 inferior_object
*inf_obj
;
284 struct threadlist_entry
**entry
, *tmp
;
286 if (!gdb_python_initialized
)
289 cleanup
= ensure_python_env (python_gdbarch
, python_language
);
292 = (inferior_object
*) find_inferior_object (ptid_get_pid (tp
->ptid
));
295 do_cleanups (cleanup
);
299 /* Find thread entry in its inferior's thread_list. */
300 for (entry
= &inf_obj
->threads
; *entry
!= NULL
; entry
=
302 if ((*entry
)->thread_obj
->thread
== tp
)
308 do_cleanups (cleanup
);
313 tmp
->thread_obj
->thread
= NULL
;
315 *entry
= (*entry
)->next
;
318 Py_DECREF (tmp
->thread_obj
);
322 do_cleanups (cleanup
);
326 infpy_threads (PyObject
*self
, PyObject
*args
)
329 struct threadlist_entry
*entry
;
330 inferior_object
*inf_obj
= (inferior_object
*) self
;
332 volatile struct gdb_exception except
;
334 INFPY_REQUIRE_VALID (inf_obj
);
336 TRY_CATCH (except
, RETURN_MASK_ALL
)
337 update_thread_list ();
338 GDB_PY_HANDLE_EXCEPTION (except
);
340 tuple
= PyTuple_New (inf_obj
->nthreads
);
344 for (i
= 0, entry
= inf_obj
->threads
; i
< inf_obj
->nthreads
;
345 i
++, entry
= entry
->next
)
347 Py_INCREF (entry
->thread_obj
);
348 PyTuple_SET_ITEM (tuple
, i
, (PyObject
*) entry
->thread_obj
);
355 infpy_get_num (PyObject
*self
, void *closure
)
357 inferior_object
*inf
= (inferior_object
*) self
;
359 INFPY_REQUIRE_VALID (inf
);
361 return PyLong_FromLong (inf
->inferior
->num
);
365 infpy_get_pid (PyObject
*self
, void *closure
)
367 inferior_object
*inf
= (inferior_object
*) self
;
369 INFPY_REQUIRE_VALID (inf
);
371 return PyLong_FromLong (inf
->inferior
->pid
);
375 infpy_get_was_attached (PyObject
*self
, void *closure
)
377 inferior_object
*inf
= (inferior_object
*) self
;
379 INFPY_REQUIRE_VALID (inf
);
380 if (inf
->inferior
->attach_flag
)
386 build_inferior_list (struct inferior
*inf
, void *arg
)
388 PyObject
*list
= arg
;
389 PyObject
*inferior
= inferior_to_inferior_object (inf
);
395 success
= PyList_Append (list
, inferior
);
396 Py_DECREF (inferior
);
404 /* Implementation of gdb.inferiors () -> (gdb.Inferior, ...).
405 Returns a tuple of all inferiors. */
407 gdbpy_inferiors (PyObject
*unused
, PyObject
*unused2
)
409 PyObject
*list
, *tuple
;
411 list
= PyList_New (0);
415 if (iterate_over_inferiors (build_inferior_list
, list
))
421 tuple
= PyList_AsTuple (list
);
427 /* Membuf and memory manipulation. */
429 /* Implementation of Inferior.read_memory (address, length).
430 Returns a Python buffer object with LENGTH bytes of the inferior's
431 memory at ADDRESS. Both arguments are integers. Returns NULL on error,
432 with a python exception set. */
434 infpy_read_memory (PyObject
*self
, PyObject
*args
, PyObject
*kw
)
436 CORE_ADDR addr
, length
;
438 membuf_object
*membuf_obj
;
439 PyObject
*addr_obj
, *length_obj
, *result
;
440 volatile struct gdb_exception except
;
441 static char *keywords
[] = { "address", "length", NULL
};
443 if (! PyArg_ParseTupleAndKeywords (args
, kw
, "OO", keywords
,
444 &addr_obj
, &length_obj
))
447 if (get_addr_from_python (addr_obj
, &addr
) < 0
448 || get_addr_from_python (length_obj
, &length
) < 0)
451 TRY_CATCH (except
, RETURN_MASK_ALL
)
453 buffer
= xmalloc (length
);
455 read_memory (addr
, buffer
, length
);
457 if (except
.reason
< 0)
460 GDB_PY_HANDLE_EXCEPTION (except
);
463 membuf_obj
= PyObject_New (membuf_object
, &membuf_object_type
);
464 if (membuf_obj
== NULL
)
470 membuf_obj
->buffer
= buffer
;
471 membuf_obj
->addr
= addr
;
472 membuf_obj
->length
= length
;
475 result
= PyMemoryView_FromObject ((PyObject
*) membuf_obj
);
477 result
= PyBuffer_FromReadWriteObject ((PyObject
*) membuf_obj
, 0,
480 Py_DECREF (membuf_obj
);
485 /* Implementation of Inferior.write_memory (address, buffer [, length]).
486 Writes the contents of BUFFER (a Python object supporting the read
487 buffer protocol) at ADDRESS in the inferior's memory. Write LENGTH
488 bytes from BUFFER, or its entire contents if the argument is not
489 provided. The function returns nothing. Returns NULL on error, with
490 a python exception set. */
492 infpy_write_memory (PyObject
*self
, PyObject
*args
, PyObject
*kw
)
496 CORE_ADDR addr
, length
;
497 PyObject
*addr_obj
, *length_obj
= NULL
;
498 volatile struct gdb_exception except
;
499 static char *keywords
[] = { "address", "buffer", "length", NULL
};
503 if (! PyArg_ParseTupleAndKeywords (args
, kw
, "Os*|O", keywords
,
511 if (! PyArg_ParseTupleAndKeywords (args
, kw
, "Os#|O", keywords
,
512 &addr_obj
, &buffer
, &buf_len
,
517 if (get_addr_from_python (addr_obj
, &addr
) < 0)
522 else if (get_addr_from_python (length_obj
, &length
) < 0)
525 TRY_CATCH (except
, RETURN_MASK_ALL
)
527 write_memory_with_notification (addr
, (gdb_byte
*) buffer
, length
);
530 PyBuffer_Release (&pybuf
);
532 GDB_PY_HANDLE_EXCEPTION (except
);
538 PyBuffer_Release (&pybuf
);
543 /* Destructor of Membuf objects. */
545 mbpy_dealloc (PyObject
*self
)
547 xfree (((membuf_object
*) self
)->buffer
);
548 Py_TYPE (self
)->tp_free (self
);
551 /* Return a description of the Membuf object. */
553 mbpy_str (PyObject
*self
)
555 membuf_object
*membuf_obj
= (membuf_object
*) self
;
557 return PyString_FromFormat (_("Memory buffer for address %s, \
558 which is %s bytes long."),
559 paddress (python_gdbarch
, membuf_obj
->addr
),
560 pulongest (membuf_obj
->length
));
566 get_buffer (PyObject
*self
, Py_buffer
*buf
, int flags
)
568 membuf_object
*membuf_obj
= (membuf_object
*) self
;
571 ret
= PyBuffer_FillInfo (buf
, self
, membuf_obj
->buffer
,
572 membuf_obj
->length
, 0,
582 get_read_buffer (PyObject
*self
, Py_ssize_t segment
, void **ptrptr
)
584 membuf_object
*membuf_obj
= (membuf_object
*) self
;
588 PyErr_SetString (PyExc_SystemError
,
589 _("The memory buffer supports only one segment."));
593 *ptrptr
= membuf_obj
->buffer
;
595 return membuf_obj
->length
;
599 get_write_buffer (PyObject
*self
, Py_ssize_t segment
, void **ptrptr
)
601 return get_read_buffer (self
, segment
, ptrptr
);
605 get_seg_count (PyObject
*self
, Py_ssize_t
*lenp
)
608 *lenp
= ((membuf_object
*) self
)->length
;
614 get_char_buffer (PyObject
*self
, Py_ssize_t segment
, char **ptrptr
)
619 ret
= get_read_buffer (self
, segment
, &ptr
);
620 *ptrptr
= (char *) ptr
;
628 gdb.search_memory (address, length, pattern). ADDRESS is the
629 address to start the search. LENGTH specifies the scope of the
630 search from ADDRESS. PATTERN is the pattern to search for (and
631 must be a Python object supporting the buffer protocol).
632 Returns a Python Long object holding the address where the pattern
633 was located, or if the pattern was not found, returns None. Returns NULL
634 on error, with a python exception set. */
636 infpy_search_memory (PyObject
*self
, PyObject
*args
, PyObject
*kw
)
638 CORE_ADDR start_addr
, length
;
639 static char *keywords
[] = { "address", "length", "pattern", NULL
};
640 PyObject
*start_addr_obj
, *length_obj
;
641 volatile struct gdb_exception except
;
642 Py_ssize_t pattern_size
;
644 CORE_ADDR found_addr
;
649 if (! PyArg_ParseTupleAndKeywords (args
, kw
, "OOs*", keywords
,
650 &start_addr_obj
, &length_obj
,
655 pattern_size
= pybuf
.len
;
659 if (! PyArg_ParseTupleAndKeywords (args
, kw
, "OOO", keywords
,
660 &start_addr_obj
, &length_obj
,
664 if (!PyObject_CheckReadBuffer (pattern
))
666 PyErr_SetString (PyExc_RuntimeError
,
667 _("The pattern is not a Python buffer."));
672 if (PyObject_AsReadBuffer (pattern
, &buffer
, &pattern_size
) == -1)
676 if (get_addr_from_python (start_addr_obj
, &start_addr
) < 0)
679 if (get_addr_from_python (length_obj
, &length
) < 0)
684 PyErr_SetString (PyExc_ValueError
,
685 _("Search range is empty."));
688 /* Watch for overflows. */
689 else if (length
> CORE_ADDR_MAX
690 || (start_addr
+ length
- 1) < start_addr
)
692 PyErr_SetString (PyExc_ValueError
,
693 _("The search range is too large."));
697 TRY_CATCH (except
, RETURN_MASK_ALL
)
699 found
= target_search_memory (start_addr
, length
,
700 buffer
, pattern_size
,
704 PyBuffer_Release (&pybuf
);
706 GDB_PY_HANDLE_EXCEPTION (except
);
709 return PyLong_FromLong (found_addr
);
715 PyBuffer_Release (&pybuf
);
720 /* Implementation of gdb.Inferior.is_valid (self) -> Boolean.
721 Returns True if this inferior object still exists in GDB. */
724 infpy_is_valid (PyObject
*self
, PyObject
*args
)
726 inferior_object
*inf
= (inferior_object
*) self
;
735 infpy_dealloc (PyObject
*obj
)
737 inferior_object
*inf_obj
= (inferior_object
*) obj
;
738 struct inferior
*inf
= inf_obj
->inferior
;
743 set_inferior_data (inf
, infpy_inf_data_key
, NULL
);
746 /* Clear the INFERIOR pointer in an Inferior object and clear the
749 py_free_inferior (struct inferior
*inf
, void *datum
)
752 struct cleanup
*cleanup
;
753 inferior_object
*inf_obj
= datum
;
754 struct threadlist_entry
*th_entry
, *th_tmp
;
756 if (!gdb_python_initialized
)
759 cleanup
= ensure_python_env (python_gdbarch
, python_language
);
761 inf_obj
->inferior
= NULL
;
763 /* Deallocate threads list. */
764 for (th_entry
= inf_obj
->threads
; th_entry
!= NULL
;)
766 Py_DECREF (th_entry
->thread_obj
);
769 th_entry
= th_entry
->next
;
773 inf_obj
->nthreads
= 0;
775 Py_DECREF ((PyObject
*) inf_obj
);
776 do_cleanups (cleanup
);
779 /* Implementation of gdb.selected_inferior() -> gdb.Inferior.
780 Returns the current inferior object. */
783 gdbpy_selected_inferior (PyObject
*self
, PyObject
*args
)
785 return inferior_to_inferior_object (current_inferior ());
789 gdbpy_initialize_inferior (void)
791 if (PyType_Ready (&inferior_object_type
) < 0)
794 if (gdb_pymodule_addobject (gdb_module
, "Inferior",
795 (PyObject
*) &inferior_object_type
) < 0)
799 register_inferior_data_with_cleanup (NULL
, py_free_inferior
);
801 observer_attach_new_thread (add_thread_object
);
802 observer_attach_thread_exit (delete_thread_object
);
803 observer_attach_normal_stop (python_on_normal_stop
);
804 observer_attach_target_resumed (python_on_resume
);
805 observer_attach_inferior_exit (python_inferior_exit
);
806 observer_attach_new_objfile (python_new_objfile
);
808 membuf_object_type
.tp_new
= PyType_GenericNew
;
809 if (PyType_Ready (&membuf_object_type
) < 0)
812 return gdb_pymodule_addobject (gdb_module
, "Membuf", (PyObject
*)
813 &membuf_object_type
);
816 static PyGetSetDef inferior_object_getset
[] =
818 { "num", infpy_get_num
, NULL
, "ID of inferior, as assigned by GDB.", NULL
},
819 { "pid", infpy_get_pid
, NULL
, "PID of inferior, as assigned by the OS.",
821 { "was_attached", infpy_get_was_attached
, NULL
,
822 "True if the inferior was created using 'attach'.", NULL
},
826 static PyMethodDef inferior_object_methods
[] =
828 { "is_valid", infpy_is_valid
, METH_NOARGS
,
829 "is_valid () -> Boolean.\n\
830 Return true if this inferior is valid, false if not." },
831 { "threads", infpy_threads
, METH_NOARGS
,
832 "Return all the threads of this inferior." },
833 { "read_memory", (PyCFunction
) infpy_read_memory
,
834 METH_VARARGS
| METH_KEYWORDS
,
835 "read_memory (address, length) -> buffer\n\
836 Return a buffer object for reading from the inferior's memory." },
837 { "write_memory", (PyCFunction
) infpy_write_memory
,
838 METH_VARARGS
| METH_KEYWORDS
,
839 "write_memory (address, buffer [, length])\n\
840 Write the given buffer object to the inferior's memory." },
841 { "search_memory", (PyCFunction
) infpy_search_memory
,
842 METH_VARARGS
| METH_KEYWORDS
,
843 "search_memory (address, length, pattern) -> long\n\
844 Return a long with the address of a match, or None." },
848 static PyTypeObject inferior_object_type
=
850 PyVarObject_HEAD_INIT (NULL
, 0)
851 "gdb.Inferior", /* tp_name */
852 sizeof (inferior_object
), /* tp_basicsize */
854 infpy_dealloc
, /* tp_dealloc */
860 0, /* tp_as_number */
861 0, /* tp_as_sequence */
862 0, /* tp_as_mapping */
868 0, /* tp_as_buffer */
869 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_ITER
, /* tp_flags */
870 "GDB inferior object", /* tp_doc */
873 0, /* tp_richcompare */
874 0, /* tp_weaklistoffset */
877 inferior_object_methods
, /* tp_methods */
879 inferior_object_getset
, /* tp_getset */
882 0, /* tp_descr_get */
883 0, /* tp_descr_set */
884 0, /* tp_dictoffset */
891 static PyBufferProcs buffer_procs
=
898 /* Python doesn't provide a decent way to get compatibility here. */
899 #if HAVE_LIBPYTHON2_4
900 #define CHARBUFFERPROC_NAME getcharbufferproc
902 #define CHARBUFFERPROC_NAME charbufferproc
905 static PyBufferProcs buffer_procs
= {
909 /* The cast here works around a difference between Python 2.4 and
911 (CHARBUFFERPROC_NAME
) get_char_buffer
915 static PyTypeObject membuf_object_type
= {
916 PyVarObject_HEAD_INIT (NULL
, 0)
917 "gdb.Membuf", /*tp_name*/
918 sizeof (membuf_object
), /*tp_basicsize*/
920 mbpy_dealloc
, /*tp_dealloc*/
927 0, /*tp_as_sequence*/
934 &buffer_procs
, /*tp_as_buffer*/
935 Py_TPFLAGS_DEFAULT
, /*tp_flags*/
936 "GDB memory buffer object", /*tp_doc*/
939 0, /* tp_richcompare */
940 0, /* tp_weaklistoffset */
948 0, /* tp_descr_get */
949 0, /* tp_descr_set */
950 0, /* tp_dictoffset */