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  <kevin.pouget@st.com>

	Allow Python notification of new object-file loadings.
	* gdb.texinfo (Events In Python): Document `gdb.NewObjFileEvent'
	event type.

2011-10-06  Kevin Pouget  <kevin.pouget@st.com>

	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.
This commit is contained in:
Kevin Pouget 2011-10-07 07:38:30 +00:00
parent 8031b6f821
commit 20c168b519
13 changed files with 127 additions and 5 deletions

View file

@ -1,3 +1,38 @@
2011-10-07 Kevin Pouget <kevin.pouget@st.com>
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 <kevin.pouget@st.com>
Allow Python notification of new object-file loadings.
* gdb.texinfo (Events In Python): Document `gdb.NewObjFileEvent'
event type.
2011-10-07 Kevin Pouget <kevin.pouget@st.com>
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 <gingold@adacore.com> 2011-10-05 Tristan Gingold <gingold@adacore.com>
* ada-tasks.c (read_atcb): Make ravenscar_task_name static. * ada-tasks.c (read_atcb): Make ravenscar_task_name static.

View file

@ -289,6 +289,7 @@ SUBDIR_PYTHON_OBS = \
py-inferior.o \ py-inferior.o \
py-infthread.o \ py-infthread.o \
py-lazy-string.o \ py-lazy-string.o \
py-newobjfileevent.o \
py-objfile.o \ py-objfile.o \
py-param.o \ py-param.o \
py-prettyprint.o \ py-prettyprint.o \
@ -319,6 +320,7 @@ SUBDIR_PYTHON_SRCS = \
python/py-inferior.c \ python/py-inferior.c \
python/py-infthread.c \ python/py-infthread.c \
python/py-lazy-string.c \ python/py-lazy-string.c \
python/py-newobjfileevent.c \
python/py-objfile.c \ python/py-objfile.c \
python/py-param.c \ python/py-param.c \
python/py-prettyprint.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 $(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/py-lazy-string.c
$(POSTCOMPILE) $(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 py-objfile.o: $(srcdir)/python/py-objfile.c
$(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/py-objfile.c $(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/py-objfile.c
$(POSTCOMPILE) $(POSTCOMPILE)

View file

@ -46,6 +46,9 @@
For example, "some_type['myfield']" now works, as does For example, "some_type['myfield']" now works, as does
"some_type.items()". "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. * libthread-db-search-path now supports two special values: $sdir and $pdir.
$sdir specifies the default system locations of shared libraries. $sdir specifies the default system locations of shared libraries.
$pdir specifies the directory where the libpthread used by the application $pdir specifies the directory where the libpthread used by the application

View file

@ -22358,6 +22358,17 @@ in favor of the @code{gdb.BreakpointEvent.breakpoints} attribute.
@end defvar @end defvar
@end table @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 @end table
@node Threads In Python @node Threads In Python

View file

@ -111,6 +111,7 @@ extern int evpy_emit_event (PyObject *event,
extern PyObject *create_event_object (PyTypeObject *py_type); extern PyObject *create_event_object (PyTypeObject *py_type);
extern PyObject *create_thread_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 void evpy_dealloc (PyObject *self);
extern int evpy_add_attribute (PyObject *event, extern int evpy_add_attribute (PyObject *event,

View file

@ -45,6 +45,7 @@ typedef struct
eventregistry_object *stop; eventregistry_object *stop;
eventregistry_object *cont; eventregistry_object *cont;
eventregistry_object *exited; eventregistry_object *exited;
eventregistry_object *new_objfile;
PyObject *module; PyObject *module;

View file

@ -58,6 +58,9 @@ gdbpy_initialize_py_events (void)
if (add_new_registry (&gdb_py_events.exited, "exited") < 0) if (add_new_registry (&gdb_py_events.exited, "exited") < 0)
goto fail; goto fail;
if (add_new_registry (&gdb_py_events.new_objfile, "new_objfile") < 0)
goto fail;
Py_INCREF (gdb_py_events.module); Py_INCREF (gdb_py_events.module);
if (PyModule_AddObject (gdb_module, if (PyModule_AddObject (gdb_module,
"events", "events",

View file

@ -22,6 +22,7 @@
#include "gdbcore.h" #include "gdbcore.h"
#include "gdbthread.h" #include "gdbthread.h"
#include "inferior.h" #include "inferior.h"
#include "objfiles.h"
#include "observer.h" #include "observer.h"
#include "python-internal.h" #include "python-internal.h"
#include "arch-utils.h" #include "arch-utils.h"
@ -125,6 +126,25 @@ python_inferior_exit (struct inferior *inf)
do_cleanups (cleanup); 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 /* Return a reference to the Python object of type Inferior
representing INFERIOR. If the object has already been created, representing INFERIOR. If the object has already been created,
return it and increment the reference count, otherwise, create it. 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_normal_stop (python_on_normal_stop);
observer_attach_target_resumed (python_on_resume); observer_attach_target_resumed (python_on_resume);
observer_attach_inferior_exit (python_inferior_exit); observer_attach_inferior_exit (python_inferior_exit);
observer_attach_new_objfile (python_new_objfile);
membuf_object_type.tp_new = PyType_GenericNew; membuf_object_type.tp_new = PyType_GenericNew;
if (PyType_Ready (&membuf_object_type) < 0) if (PyType_Ready (&membuf_object_type) < 0)

View file

@ -214,6 +214,7 @@ void gdbpy_initialize_breakpoint_event (void);
void gdbpy_initialize_continue_event (void); void gdbpy_initialize_continue_event (void);
void gdbpy_initialize_exited_event (void); void gdbpy_initialize_exited_event (void);
void gdbpy_initialize_thread_event (void); void gdbpy_initialize_thread_event (void);
void gdbpy_initialize_new_objfile_event (void);
struct cleanup *make_cleanup_py_decref (PyObject *py); struct cleanup *make_cleanup_py_decref (PyObject *py);

View file

@ -1257,6 +1257,7 @@ Enables or disables printing of Python stack traces."),
gdbpy_initialize_continue_event (); gdbpy_initialize_continue_event ();
gdbpy_initialize_exited_event (); gdbpy_initialize_exited_event ();
gdbpy_initialize_thread_event (); gdbpy_initialize_thread_event ();
gdbpy_initialize_new_objfile_event () ;
observer_attach_before_prompt (before_prompt_hook); observer_attach_before_prompt (before_prompt_hook);

View file

@ -16,6 +16,8 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
extern void do_nothing (void);
int second(){ int second(){
fork() ; fork() ;
return 12; return 12;
@ -26,5 +28,6 @@ int first(){
} }
int main (){ int main (){
do_nothing();
return first(); return first();
} }

View file

@ -19,23 +19,39 @@ if $tracelevel then {
load_lib gdb-python.exp 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 testfile "py-events"
set srcfile ${testfile}.c set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile} set binfile ${objdir}/${subdir}/${testfile}
set exec_opts [list debug shlib=$lib_sl]
set pyfile ${srcdir}/${subdir}/${testfile}.py set pyfile ${srcdir}/${subdir}/${testfile}.py
if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } { if [get_compiler_info ${binfile}] {
return -1 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 } if { [skip_python_tests] } { continue }
gdb_test_no_output "python execfile ('${pyfile}')" "" gdb_test_no_output "python execfile ('${pyfile}')" ""
if ![runto_main ] then { gdb_test "Test_Newobj_Events" "New ObjectFile Event tester registered." "Register new objfile event handler"
fail "Can't run to main"
return -1 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" "" gdb_test_no_output "set detach-on-fork off" ""

View file

@ -51,6 +51,14 @@ def continue_handler (event):
if ( event.inferior_thread is not None) : if ( event.inferior_thread is not None) :
print "thread num: %s" % (event.inferior_thread.num); 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): class test_events (gdb.Command):
"""Test events.""" """Test events."""
@ -65,3 +73,15 @@ class test_events (gdb.Command):
print "Event testers registered." print "Event testers registered."
test_events () 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 ()