Since this mail list bot seems to ingore the seccond attachement, heres the
documentation in text...
Accessing the variables
To print the specified Celix structure, first its data fields must be retrieved
and inspected. The data fields are represented by gdb.value objects, which is
an object defined in the gdb module (this module needs to be imported). The gdb
module implements a “to string” function for standard C types, so all that’s
needed is to select the wanted variables and to convert the gdb.values to the
desired type. For some of the type’s functionality a module called gdb.types
has to be imported.
The selection part is completely subjective, and mostly has to do with which
data the programmer finds interesting enough to print.
Converting the gdb.values is done in multiple ways, for pointers there’s the
gdb.value.dereference method, which returns another gdb.value, of the
referenced object.
bundle_struct = bundle_pointer.dereference()
To convert types (i.e. from void pointer to bundle_pt), the gdb.value.cast
method can be used. To get a specified type (bundle_pt is not known by gdb),
gdb.lookup_type is used. This will resolve the type name at run time, and pass
back a gdb.type object.
bundle_pointer = some_void_pt.cast(gdb.lookup_type("bundle_pt"))
To convert the final acquired value to a string that can be printed, the
default str method is used. (i.e. “str(value)” ).
Outputting strings
Initially the printers to string function was implemented to print out the
entire struct, however, when such an output is printed, it is truncated. GDB
expects a short string back, with simply the object name, or key information.
The actual structures data fields, are implemented in the “children” method.
This method returns a list (or any other python iterable object)
This list contains tuple pairs of strings, where the template for the strings
is:
tuple_object = (str_object_name, str_object_value)
children_list.append(tuple_object)
The brackets around the two objects returns a tuple, which can then be appended
to the list (or assigned to an intermediate variable if needed).
Printing nested structures
Celix framework structures are quite complex and are almost always constructed
of other, nested structures. This means that in order to print all the relevant
information, sometimes an abbreviated representation of another struct must be
used. For this purpose, the student created other pretty printers, with an
added method, “short_string”. This returns the key information of a structure,
i.e. in the case of the module, it prints the modules “symbolic_name” and “id”,
which in many cases is enough for the programmer to identify the module.
module_str = module_printer(module).to_short_string()
If additional information is needed, the user can call the full printer for the
actual object, which would call the normal toString method.
Printing lists
A combination of casting and printing nested structures is needed when printing
a list of structs. For example, the “module” used in the example for printing
nested structures, is stored in an arraylist called modules “bundle->modules”.
All Celix lists/maps store void pointers, which need to be explicitly casted by
the programmer in each use, this makes it impossible to make a generic printer
for such objects. A solution is to access the data in the printer, and then
call the associated printer (combining the casting, and the printing nested
structures examples). See celix_printers.py, line 21 to 35, for an example of
printing an arraylist of modules.
From: [email protected]
To: [email protected]
Subject: Celix debugging tools
Date: Fri, 29 Jan 2016 15:54:04 +0100
Hello,
Menno van der Graaf here, you might have seen me post patches on the Celix-Jira.
I was advised to send a mail about some work I did recently (although as it
stands right now,
its mostly a small experiment).
To help with debugging the framework, I wrote some gdb extentions to enhance
printing of the bundle structure, and the bundle archive structure.
Meaning that it shows more relevant data, and less irrelevant data.
For those that are interested, they are implemented in python, with the gdb
python API.
Through this API I implemented so called "pretty printers" for the structures,
these "pretty printers" are basicly fancy toString functions.
The files can be found attached to this message.
To install the printers, execute the script "load.py"
(gdb) python execfile("load.py")
(please note that you might need to edit the first line to specify a include
directory)
there are ways to autoload it with gdb, or put it in your gdb init file
now, to check if they are installed (and for which types)
(gdb) info pretty-printer
Once loaded, gdb will automatically call the toString whenever you try to print
a instance of the type. i.e.:
(gdb) print *context->bundle
for the struct bundle, the printer goes into the arraylist of modules, fetches
and prints the names and id of each module, and shows the location of the
archive.
for the struct bundleArchive, it prints the revisions from the linkedlist.
there are more types partially implemented, but these are only used internally
as of yet.
for those interested in extending the functionality, i attached some
documentation on how i implemented them.
you can also read the gdb python API documentation
Any way, hope that someone finds this usefull,
Menno van der Graaf