Add Python support for GDB events.
2011-02-04 Sami Wagiaalla <swagiaal@redhat.com> * gdb.python/py-evthreads.c: New file. * gdb.python/py-evthreads.exp: New file. * gdb.python/py-events.py: New file. * gdb.python/py-events.exp: New file. * gdb.python/py-events.c: New file. 2011-02-04 Sami Wagiaalla <swagiaal@redhat.com> Oguz Kayral <oguzkayral@gmail.com> * python/py-inferior.c (python_on_normal_stop): New function. (python_on_resume): New function. (python_inferior_exit): New function. (gdbpy_initialize_inferior): Add normal_stop, target_resumed, and inferior_exit observers. * python/py-evtregistry.c: New file. * python/py-threadevent.c : New file. * python/py-event.c: New file. * python/py-evts.c: New file. * python/py-continueevent.c: New file. * python/py-bpevent.c: New file. * python/py-signalevent.c: New file. * python/py-exetiedevent.c: New file. * python/py-breakpoint.c (gdbpy_breakpoint_from_bpstats): New function. Move struct breakpoint_object from here... * python/python-internal.h: ... to here. * python/py-event.h: New file. * python/py-events.h: New file. * Makefile.in (SUBDIR_PYTHON_OBS): Add py-breakpointstopevent.o, py-continueevent.o, py-event.o, py-eventregistry.o, py-events.o, py-exitedevent.o, py-signalstopevent.o, and py-stopevent.o. (SUBDIR_PYTHON_SRCS): Add py-breakpointstopevent.c, py-continueevent.c, py-event.c, py-eventregistry.c, py-events.c, py-exitedevent.c, py-signalstopevent.c, and py-stopevent.c. Add build rules for all the above.
This commit is contained in:
parent
9e0ac56407
commit
505500db28
9 changed files with 308 additions and 6 deletions
|
@ -26,6 +26,9 @@
|
|||
#include "python-internal.h"
|
||||
#include "arch-utils.h"
|
||||
#include "language.h"
|
||||
#include "gdb_signals.h"
|
||||
#include "py-event.h"
|
||||
#include "py-stopevent.h"
|
||||
|
||||
struct threadlist_entry {
|
||||
thread_object *thread_obj;
|
||||
|
@ -73,6 +76,59 @@ static PyTypeObject membuf_object_type;
|
|||
} \
|
||||
} while (0)
|
||||
|
||||
static void
|
||||
python_on_normal_stop (struct bpstats *bs, int print_frame)
|
||||
{
|
||||
struct cleanup *cleanup;
|
||||
enum target_signal stop_signal;
|
||||
|
||||
if (!find_thread_ptid (inferior_ptid))
|
||||
return;
|
||||
|
||||
stop_signal = inferior_thread ()->suspend.stop_signal;
|
||||
|
||||
cleanup = ensure_python_env (get_current_arch (), current_language);
|
||||
|
||||
if (emit_stop_event (bs, stop_signal) < 0)
|
||||
gdbpy_print_stack ();
|
||||
|
||||
do_cleanups (cleanup);
|
||||
}
|
||||
|
||||
static void
|
||||
python_on_resume (ptid_t ptid)
|
||||
{
|
||||
struct cleanup *cleanup;
|
||||
|
||||
cleanup = ensure_python_env (get_current_arch (), current_language);
|
||||
|
||||
if (emit_continue_event (ptid) < 0)
|
||||
gdbpy_print_stack ();
|
||||
|
||||
do_cleanups (cleanup);
|
||||
}
|
||||
|
||||
static void
|
||||
python_inferior_exit (struct inferior *inf)
|
||||
{
|
||||
struct cleanup *cleanup;
|
||||
LONGEST exit_code = -1;
|
||||
ptid_t ptidp;
|
||||
struct target_waitstatus status;
|
||||
|
||||
cleanup = ensure_python_env (get_current_arch (), current_language);
|
||||
|
||||
get_last_target_status (&ptidp, &status);
|
||||
|
||||
exit_code = status.value.integer;
|
||||
|
||||
if (exit_code >= 0
|
||||
&& emit_exited_event (exit_code) < 0)
|
||||
gdbpy_print_stack ();
|
||||
|
||||
do_cleanups (cleanup);
|
||||
}
|
||||
|
||||
/* Return a borrowed reference to the Python object of type Inferior
|
||||
representing INFERIOR. If the object has already been created,
|
||||
return it, otherwise, create it. Return NULL on failure. */
|
||||
|
@ -108,8 +164,8 @@ inferior_to_inferior_object (struct inferior *inferior)
|
|||
|
||||
/* Finds the Python Inferior object for the given PID. Returns a
|
||||
borrowed reference, or NULL if PID does not match any inferior
|
||||
obect.
|
||||
*/
|
||||
object. */
|
||||
|
||||
PyObject *
|
||||
find_inferior_object (int pid)
|
||||
{
|
||||
|
@ -590,6 +646,9 @@ gdbpy_initialize_inferior (void)
|
|||
|
||||
observer_attach_new_thread (add_thread_object);
|
||||
observer_attach_thread_exit (delete_thread_object);
|
||||
observer_attach_normal_stop (python_on_normal_stop);
|
||||
observer_attach_target_resumed (python_on_resume);
|
||||
observer_attach_inferior_exit (python_inferior_exit);
|
||||
|
||||
if (PyType_Ready (&membuf_object_type) < 0)
|
||||
return;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue