Last time I promised something flashy in this post. What could be flashier than a GUI?
Here’s some code to get you started:
from threading import Thread import gtk def printit (): print "Hello hacker" class TestGtkThread (Thread): def destroy (self, *args): self.window.hide() def hello (self, *args): gdb.post_event (printit) def run (self): gtk.gdk.threads_init() self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) self.window.connect("destroy", self.destroy) self.window.set_border_width(10) button = gtk.Button("Hello World") # connects the 'hello' function to the clicked signal from the button button.connect("clicked", self.hello) self.window.add(button) button.show() self.window.show_all() gtk.main() class TestGtk (gdb.Command): def __init__ (self): super (TestGtk, self).__init__ ("testgtk", gdb.COMMAND_NONE, gdb.COMPLETE_NONE) self.init = False def invoke (self, arg, from_tty): self.dont_repeat() if not self.init: self.init = True v = TestGtkThread() v.setDaemon (True) v.start () TestGtk()
Note that we finesse the problem of main loop integration by simply starting a separate thread. My thinking here is to just use message passing: keep gdb operations in the gdb thread, and gtk operations in the GUI thread, and send active objects back and forth as needed to do work. The function gdb.post_event
(git pull
to get this) arranges to run a function during the gdb event loop; I haven’t really investigated sending events the other direction.
The above isn’t actually useful — in fact it is just a simple transcription of a python-gtk demo I found somewhere in /usr/share
. However, the point is that the addition of Python cracks gdb open: now you can combine gdb’s inferior-inspection capabilities with Python’s vast suite of libraries. You aren’t tied to the capabilities of a given gdb GUI; you can write custom visualizers, auto-load them or load them on demand, and use them in parallel with the CLI. If your GUI provides a CLI, you can do this without any hacks there at all; for example, this kind of thing works great from inside Emacs.
The next post is the final one in this series, I’m sorry to say.
2 Comments
Don’t forget to call this:
import gobject
gobject.threads_init()
before importing gtk. Otherwise if you starting to play around with threads, you’re going to see plenty of interesting crashes.
Thanks for writing this series (and the code!), it has been a good read all along. The future of GDB also looks much brighter with python scripting, I would say.