From 20c168b5194d56e3f0f6a19db5905737463eadeb Mon Sep 17 00:00:00 2001 From: Kevin Pouget Date: Fri, 7 Oct 2011 07:38:30 +0000 Subject: [PATCH] Allow Python notification of new object-file loadings. * Makefile.in (SUBDIR_PYTHON_SRCS): Add py-newobjfilevent.c. (SUBDIR_PYTHON_OBS): Add py-newobjfileevent.o. Add build rule for this file. * python/py-event.h (emit_new_objfile_event): New prototype. (newobjfile): New Python event emitter. * python/py-evts.c (gdbpy_initialize_py_events): Add new_objfile to Python event registry. * python/py-inferior.c: Include objfiles.h (python_new_objfile): New function. (gdbpy_initialize_inferior): Add python_new_objfile to the new objfile observers. * python/py-newobjfileevent.c: New file. * python-internal.h (gdbpy_initialize_new_objfile_event): New prototype. * python/python.c (_initialize_python): Add gdbpy_initialize_new_objfile_event call. * NEWS: Add item for new Python event "gdb.newobjfile" 2011-10-06 Kevin Pouget Allow Python notification of new object-file loadings. * gdb.texinfo (Events In Python): Document `gdb.NewObjFileEvent' event type. 2011-10-06 Kevin Pouget Allow Python notification of new object-file loadings. * gdb.python/py-events.exp: Test newobjfile event. * gdb.python/py-events.py: Register newobjfile callback. * gdb.python/py-events.c: Add call to shared library * gdb.python/py-events-shlib.c: New file. --- gdb/ChangeLog | 35 ++++++++++++++++++++++++++ gdb/Makefile.in | 6 +++++ gdb/NEWS | 3 +++ gdb/doc/gdb.texinfo | 11 ++++++++ gdb/python/py-event.h | 1 + gdb/python/py-events.h | 1 + gdb/python/py-evts.c | 3 +++ gdb/python/py-inferior.c | 21 ++++++++++++++++ gdb/python/python-internal.h | 1 + gdb/python/python.c | 1 + gdb/testsuite/gdb.python/py-events.c | 3 +++ gdb/testsuite/gdb.python/py-events.exp | 26 +++++++++++++++---- gdb/testsuite/gdb.python/py-events.py | 20 +++++++++++++++ 13 files changed, 127 insertions(+), 5 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a166d14561..9f82f0d457 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,38 @@ +2011-10-07 Kevin Pouget + + Allow Python notification of new object-file loadings. + * Makefile.in (SUBDIR_PYTHON_SRCS): Add py-newobjfilevent.c. + (SUBDIR_PYTHON_OBS): Add py-newobjfileevent.o. + Add build rule for this file. + * python/py-event.h (emit_new_objfile_event): New prototype. + (newobjfile): New Python event emitter. + * python/py-evts.c (gdbpy_initialize_py_events): Add new_objfile to + Python event registry. + * python/py-inferior.c: Include objfiles.h + (python_new_objfile): New function. + (gdbpy_initialize_inferior): Add python_new_objfile to the new objfile + observers. + * python/py-newobjfileevent.c: New file. + * python-internal.h (gdbpy_initialize_new_objfile_event): New + prototype. + * python/python.c (_initialize_python): Add + gdbpy_initialize_new_objfile_event call. + * NEWS: Add item for new Python event "gdb.newobjfile" + +2011-10-07 Kevin Pouget + + Allow Python notification of new object-file loadings. + * gdb.texinfo (Events In Python): Document `gdb.NewObjFileEvent' + event type. + +2011-10-07 Kevin Pouget + + Allow Python notification of new object-file loadings. + * gdb.python/py-events.exp: Test newobjfile event. + * gdb.python/py-events.py: Register newobjfile callback. + * gdb.python/py-events.c: Add call to shared library + * gdb.python/py-events-shlib.c: New file. + 2011-10-05 Tristan Gingold * ada-tasks.c (read_atcb): Make ravenscar_task_name static. diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 826d339956..986588b476 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -289,6 +289,7 @@ SUBDIR_PYTHON_OBS = \ py-inferior.o \ py-infthread.o \ py-lazy-string.o \ + py-newobjfileevent.o \ py-objfile.o \ py-param.o \ py-prettyprint.o \ @@ -319,6 +320,7 @@ SUBDIR_PYTHON_SRCS = \ python/py-inferior.c \ python/py-infthread.c \ python/py-lazy-string.c \ + python/py-newobjfileevent.c \ python/py-objfile.c \ python/py-param.c \ python/py-prettyprint.c \ @@ -2115,6 +2117,10 @@ py-lazy-string.o: $(srcdir)/python/py-lazy-string.c $(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/py-lazy-string.c $(POSTCOMPILE) +py-newobjfileevent.o: $(srcdir)/python/py-newobjfileevent.c + $(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/py-newobjfileevent.c + $(POSTCOMPILE) + py-objfile.o: $(srcdir)/python/py-objfile.c $(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/py-objfile.c $(POSTCOMPILE) diff --git a/gdb/NEWS b/gdb/NEWS index 4d434c5380..cd52d396e0 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -46,6 +46,9 @@ For example, "some_type['myfield']" now works, as does "some_type.items()". + ** A new event "gdb.new_objfile" has been added, triggered by loading a + new object file. + * libthread-db-search-path now supports two special values: $sdir and $pdir. $sdir specifies the default system locations of shared libraries. $pdir specifies the directory where the libpthread used by the application diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index dd0f7f61c0..aad877a582 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -22358,6 +22358,17 @@ in favor of the @code{gdb.BreakpointEvent.breakpoints} attribute. @end defvar @end table +@item events.new_objfile +Emits @code{gdb.NewObjFileEvent} which indicates that a new object file has +been loaded by @value{GDBN}. @code{gdb.NewObjFileEvent} has one attribute: + +@table @code +@defvar NewObjFileEvent.new_objfile +A reference to the object file (@code{gdb.Objfile}) which has been loaded. +@xref{Objfiles In Python}, for details of the @code{gdb.Objfile} object. +@end defvar +@end table + @end table @node Threads In Python diff --git a/gdb/python/py-event.h b/gdb/python/py-event.h index 49d7b6a78a..716aabde18 100644 --- a/gdb/python/py-event.h +++ b/gdb/python/py-event.h @@ -111,6 +111,7 @@ extern int evpy_emit_event (PyObject *event, extern PyObject *create_event_object (PyTypeObject *py_type); extern PyObject *create_thread_event_object (PyTypeObject *py_type); +extern int emit_new_objfile_event (struct objfile *objfile); extern void evpy_dealloc (PyObject *self); extern int evpy_add_attribute (PyObject *event, diff --git a/gdb/python/py-events.h b/gdb/python/py-events.h index bd54418b28..31ce757a67 100644 --- a/gdb/python/py-events.h +++ b/gdb/python/py-events.h @@ -45,6 +45,7 @@ typedef struct eventregistry_object *stop; eventregistry_object *cont; eventregistry_object *exited; + eventregistry_object *new_objfile; PyObject *module; diff --git a/gdb/python/py-evts.c b/gdb/python/py-evts.c index 50c05f3ad7..93790c0e6b 100644 --- a/gdb/python/py-evts.c +++ b/gdb/python/py-evts.c @@ -58,6 +58,9 @@ gdbpy_initialize_py_events (void) if (add_new_registry (&gdb_py_events.exited, "exited") < 0) goto fail; + if (add_new_registry (&gdb_py_events.new_objfile, "new_objfile") < 0) + goto fail; + Py_INCREF (gdb_py_events.module); if (PyModule_AddObject (gdb_module, "events", diff --git a/gdb/python/py-inferior.c b/gdb/python/py-inferior.c index 275caea8ba..afc3eb0c99 100644 --- a/gdb/python/py-inferior.c +++ b/gdb/python/py-inferior.c @@ -22,6 +22,7 @@ #include "gdbcore.h" #include "gdbthread.h" #include "inferior.h" +#include "objfiles.h" #include "observer.h" #include "python-internal.h" #include "arch-utils.h" @@ -125,6 +126,25 @@ python_inferior_exit (struct inferior *inf) do_cleanups (cleanup); } +/* Callback used to notify Python listeners about new objfiles loaded in the + inferior. */ + +static void +python_new_objfile (struct objfile *objfile) +{ + struct cleanup *cleanup; + + if (objfile == NULL) + return; + + cleanup = ensure_python_env (get_objfile_arch (objfile), current_language); + + if (emit_new_objfile_event (objfile) < 0) + gdbpy_print_stack (); + + do_cleanups (cleanup); +} + /* Return a reference to the Python object of type Inferior representing INFERIOR. If the object has already been created, return it and increment the reference count, otherwise, create it. @@ -715,6 +735,7 @@ gdbpy_initialize_inferior (void) observer_attach_normal_stop (python_on_normal_stop); observer_attach_target_resumed (python_on_resume); observer_attach_inferior_exit (python_inferior_exit); + observer_attach_new_objfile (python_new_objfile); membuf_object_type.tp_new = PyType_GenericNew; if (PyType_Ready (&membuf_object_type) < 0) diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h index bff40b5a78..71325e2596 100644 --- a/gdb/python/python-internal.h +++ b/gdb/python/python-internal.h @@ -214,6 +214,7 @@ void gdbpy_initialize_breakpoint_event (void); void gdbpy_initialize_continue_event (void); void gdbpy_initialize_exited_event (void); void gdbpy_initialize_thread_event (void); +void gdbpy_initialize_new_objfile_event (void); struct cleanup *make_cleanup_py_decref (PyObject *py); diff --git a/gdb/python/python.c b/gdb/python/python.c index 61c5420c32..df8e3d5fde 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -1257,6 +1257,7 @@ Enables or disables printing of Python stack traces."), gdbpy_initialize_continue_event (); gdbpy_initialize_exited_event (); gdbpy_initialize_thread_event (); + gdbpy_initialize_new_objfile_event () ; observer_attach_before_prompt (before_prompt_hook); diff --git a/gdb/testsuite/gdb.python/py-events.c b/gdb/testsuite/gdb.python/py-events.c index 665ca51ec5..c20cc849b9 100644 --- a/gdb/testsuite/gdb.python/py-events.c +++ b/gdb/testsuite/gdb.python/py-events.c @@ -16,6 +16,8 @@ along with this program. If not, see . */ +extern void do_nothing (void); + int second(){ fork() ; return 12; @@ -26,5 +28,6 @@ int first(){ } int main (){ + do_nothing(); return first(); } diff --git a/gdb/testsuite/gdb.python/py-events.exp b/gdb/testsuite/gdb.python/py-events.exp index 18419fae1f..e4203899f5 100644 --- a/gdb/testsuite/gdb.python/py-events.exp +++ b/gdb/testsuite/gdb.python/py-events.exp @@ -19,23 +19,39 @@ if $tracelevel then { load_lib gdb-python.exp +set libfile "py-events-shlib" +set libsrc $srcdir/$subdir/$libfile.c +set lib_sl $objdir/$subdir/$libfile.so +set lib_opts debug + set testfile "py-events" set srcfile ${testfile}.c set binfile ${objdir}/${subdir}/${testfile} +set exec_opts [list debug shlib=$lib_sl] set pyfile ${srcdir}/${subdir}/${testfile}.py -if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } { +if [get_compiler_info ${binfile}] { return -1 } +if { [gdb_compile_shlib $libsrc $lib_sl $lib_opts] != "" + || [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $exec_opts] != ""} { + untested "Could not compile either $libsrc or $srcdir/$subdir/$srcfile." + return -1 +} + +# Start with a fresh gdb. +clean_restart ${testfile} + if { [skip_python_tests] } { continue } gdb_test_no_output "python execfile ('${pyfile}')" "" -if ![runto_main ] then { - fail "Can't run to main" - return -1 -} +gdb_test "Test_Newobj_Events" "New ObjectFile Event tester registered." "Register new objfile event handler" + +gdb_breakpoint "main" {temporary} + +gdb_test "run" ".*event type: new_objfile.*new objfile name.*" "New objfile notification" gdb_test_no_output "set detach-on-fork off" "" diff --git a/gdb/testsuite/gdb.python/py-events.py b/gdb/testsuite/gdb.python/py-events.py index 6bdd935f3a..ab549c4e8b 100644 --- a/gdb/testsuite/gdb.python/py-events.py +++ b/gdb/testsuite/gdb.python/py-events.py @@ -51,6 +51,14 @@ def continue_handler (event): if ( event.inferior_thread is not None) : print "thread num: %s" % (event.inferior_thread.num); +def new_objfile_handler (event): + if (isinstance (event, gdb.NewObjFileEvent)): + print "event type: new_objfile" + if (event.new_objfile is not None): + print "new objfile name: %s" % (event.new_objfile.filename) + else: + print "new objfile is None" + class test_events (gdb.Command): """Test events.""" @@ -65,3 +73,15 @@ class test_events (gdb.Command): print "Event testers registered." test_events () + +class test_newobj_events (gdb.Command): + """NewObj events.""" + + def __init__ (self): + gdb.Command.__init__ (self, "test_newobj_events", gdb.COMMAND_STACK) + + def invoke (self, arg, from_tty): + gdb.events.new_objfile.connect (new_objfile_handler) + print "New ObjectFile Event tester registered." + +test_newobj_events () -- 2.34.1