From 02be9a71009c94840f2367aa5554cbe5b71f56d1 Mon Sep 17 00:00:00 2001 From: Doug Evans Date: Thu, 30 Oct 2014 17:05:17 -0700 Subject: Add ability to add attributes to gdb.Objfile and gdb.Progspace objects. gdb/ChangeLog: * NEWS: Mention ability add attributes to gdb.Objfile and gdb.Progspace objects. * python/py-objfile.c (objfile_object): New member dict. (objfpy_dealloc): Py_XDECREF dict. (objfpy_initialize): Initialize dict. (objfile_getset): Add __dict__. (objfile_object_type): Set tp_dictoffset member. * python/py-progspace.c (progspace_object): New member dict. (pspy_dealloc): Py_XDECREF dict. (pspy_initialize): Initialize dict. (pspace_getset): Add __dict__. (pspace_object_type): Set tp_dictoffset member. gdb/doc/ChangeLog: * python.texi (Progspaces In Python): Document ability to add random attributes to gdb.Progspace objects. (Objfiles In Python): Document ability to add random attributes to gdb.objfile objects. gdb/testsuite/ChangeLog: * gdb.python/py-objfile.exp: Add tests for setting random attributes in objfiles. * gdb.python/py-progspace.exp: Add tests for setting random attributes in progspaces. --- gdb/doc/ChangeLog | 7 ++++++ gdb/doc/python.texi | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) (limited to 'gdb/doc') diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index f60fd8fc0b2..2e619da5dad 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,10 @@ +2014-10-30 Doug Evans + + * python.texi (Progspaces In Python): Document ability to add + random attributes to gdb.Progspace objects. + (Objfiles In Python): Document ability to add random attributes to + gdb.objfile objects. + 2014-10-27 Pedro Alves * gdb.texinfo (Continuing and Stepping): Add cross reference to diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi index f1fd841bf9c..5b35306135e 100644 --- a/gdb/doc/python.texi +++ b/gdb/doc/python.texi @@ -3366,6 +3366,50 @@ The @code{frame_filters} attribute is a dictionary of frame filter objects. @xref{Frame Filter API}, for more information. @end defvar +One may add arbitrary attributes to @code{gdb.Progspace} objects +in the usual Python way. +This is useful if, for example, one needs to do some extra record keeping +associated with the program space. + +In this contrived example, we want to perform some processing when +an objfile with a certain symbol is loaded, but we only want to do +this once because it is expensive. To achieve this we record the results +with the program space because we can't predict when the desired objfile +will be loaded. + +@smallexample +(gdb) python +def clear_objfiles_handler(event): + event.progspace.expensive_computation = None +def expensive(symbol): + """A mock routine to perform an "expensive" computation on symbol.""" + print "Computing the answer to the ultimate question ..." + return 42 +def new_objfile_handler(event): + objfile = event.new_objfile + progspace = objfile.progspace + if not hasattr(progspace, 'expensive_computation') or \ + progspace.expensive_computation is None: + # We use 'main' for the symbol to keep the example simple. + # Note: There's no current way to constrain the lookup + # to one objfile. + symbol = gdb.lookup_global_symbol('main') + if symbol is not None: + progspace.expensive_computation = expensive(symbol) +gdb.events.clear_objfiles.connect(clear_objfiles_handler) +gdb.events.new_objfile.connect(new_objfile_handler) +end +(gdb) file /tmp/hello +Reading symbols from /tmp/hello...done. +Computing the answer to the ultimate question ... +(gdb) python print gdb.current_progspace().expensive_computation +42 +(gdb) run +Starting program: /tmp/hello +Hello. +[Inferior 1 (process 4242) exited normally] +@end smallexample + @node Objfiles In Python @subsubsection Objfiles In Python @@ -3426,6 +3470,28 @@ The @code{frame_filters} attribute is a dictionary of frame filter objects. @xref{Frame Filter API}, for more information. @end defvar +One may add arbitrary attributes to @code{gdb.Objfile} objects +in the usual Python way. +This is useful if, for example, one needs to do some extra record keeping +associated with the objfile. + +In this contrived example we record the time when @value{GDBN} +loaded the objfile. + +@smallexample +(gdb) python +import datetime +def new_objfile_handler(event): + # Set the time_loaded attribute of the new objfile. + event.new_objfile.time_loaded = datetime.datetime.today() +gdb.events.new_objfile.connect(new_objfile_handler) +end +(gdb) file ./hello +Reading symbols from ./hello...done. +(gdb) python print gdb.objfiles()[0].time_loaded +2014-10-09 11:41:36.770345 +@end smallexample + A @code{gdb.Objfile} object has the following methods: @defun Objfile.is_valid () -- cgit v1.2.1