MONDO - Release Version 0.20

© 2002-2003 Donour Sizemore, Jacob Lilly, David M. Beazley

Table of Contents

0. How to read this documentation

If you are installing mondo for the first time please read through the installation section for the requirements of MONDO. The features section details the workings of MONDO. The version history shows the additions to MONDO over time. Refer to the table of contents for any other questions.

1. Introduction

For the past 10-15 years, shared libraries and dynamic linking have changed the way in which application programmers write software. Instead of writing huge monolithic applications, it is quite common to execute smaller software components, extension modules, and plugins. For example, when programmers use scripting languages like Python or Tcl, they also tend to use a collection of loosely-coupled dynamically loadable extension modules. Similarly, dynamic modules are commonly used to extend web servers, browsers, and other large programming environments.

Although dynamic linking offers many benefits such as increased modularity, simplified maintenance, and extensibility, it has also produced a considerable amount of programmer confusion. Few programmers would claim to really know how dynamic linking actually works. Moreover, the runtime linking process depends heavily on the system configuration, environment variables, subtle compiler and linker options, and the flags passed to low-level dynamic loader. Needless to say, the interaction of these pieces tends to produce a very muddled picture of what is actually going on inside an application that uses shared libraries. To make matters worse, traditional debugging tools are of little assistance since they are primarily concerned with errors in program logic rather than errors that arise from the way in which a program is constructed and linked.

MONDO (Monitor of Dynamic Objects) that is designed to help programmers discover problems related to the run-time linking of an application. MONDO works by watching real-time debug traces generated by the run-time linker ( and using the output information to construct a global view of an application, its libraries, and dynamically loaded modules (if any). Using this information, it is possible examine symbol bindings, library dependencies, and to uncover subtle programming problems related to linking that are otherwise hidden from the programmer by the limitations of classic debugging tools.

1.1 Release History

1.2 Installation

Installation Requirements

The following programs are required prior to the installation of MONDO.

Python 2.2: Earlier releases will not work.

SWIG >1.3.x: MONDO requires the 1.3.x release series for it's typemapping. There are known problems with version <1.3.17 so go for the latest release.

Graphviz 1.8.x: In order to generate library dependance graphs, Graphviz is required. Any recent very should work, but the developers use 1.8.10

GTK+ 2.0 + PyGTK or Tkinter or ncurses: Depending on which interface you want to use you'll need to make sure that various libaries as installed. The recommended interface is gtk. GTK+-2.0 and the latest version of PyGTK will need to be installed to use it. To use Tkinter, make sure python was build with tcl/tk support. If both of these are unavailable (or you want to run mondo across a very slow connection), a curses interface is available. This is built on top of the python curses module

GNOME-PYTHON is optional. It provides an integrated terminal when using gtk.

Installation Instructions

The first thing to do prior to installing MONDO is to make sure you have the correct/current versions of the listed programs in the requirements section. If you do not have these required programs, please follow the links from the MONDO home page located at The same page also contains release tarballs.

Now run make to build the necessary libraries and run make install to install mondo's files. The MONDO makefile accepts the following options to configure how things get build:

So, to build MONDO on the University of Chicago CS machines, run :
make PYINC=-I/opt/python/python-2.2/include/python2.2/ SWIG=/opt/swig/swig-1.3.17/bin/swig

1.3 GUI

In order to run on a variety of platforms, MONDO supports several interface libraries. On X11 MONDO is available using the tradition Tkinter widget set or using GTK2. One the console, MONDO uses the python 2.x curses module which is based on ncurses.

1.3.1 GUI - GTK

GTK is the default interface to MONDO and it will be selected automatically if no preference is given. It's important to note that GTK2 is a strict requirement. MONDO will not run with the gtk 1.x libraries.

If you notice from the screenshot to the right, constant/variable symbols will appear purple and functions are will show up green.

ZVT: If the gnome-python package is installed (and built the zvt module), MONDO will use it to provide an integrated terminal for the stdin/out/err of traced programs. The the package is not available, traced programs will use MONDO's stdio.

Right-clicking on a session name (the proccess name) will display a menu that allows the you save the session, view verbose trace data, open the stdio window, and generate a library dependence graph. Right-clicking a function symbol (in green) will provide symbol information (currently a disassembly). The File menu allows opening of saved sessions, running new programs, and quitting the application. Pressing CTRL+r will allow you to start a new trace session. You'll also get a timestamp to differentiate sessions with the same name.

1.3.2 GUI - TK

In order to use the Tkinter gui use the -tk option. For example: mondo -tk [application]

Tkinter support has been discontinued as of release 0.10.

1.3.3 GUI - CURSES

In order to use the curses gui use the -curses option. For example: mondo -curses [application]

In text mode, MONDO splits it's functionality into several viewing contexts. These include:

  • Library/Symbol Tree
  • LD Trace (parsed and unparsed)
  • Symbol Disassembly
  • Program console (broken)
Press ? to bring up a list of available commands. The main MONDO title bar is always visible and it displays (read left to right): current application name, trace session id, total number of traced sessions, "Mondo", mondo release version.

2. Features

MONDO is a real-time monitor of dynamic objects that allows users to trace linking and object dependencies through a variety of interfaces. MONDO's main interface is a table setup of libraries and symbols. From this initial GUI setup users are able to track which symbols are bound and which libraries are currently linked by the program. The user is able to use MONDO to generate a dependency graph via graphviz. In the case of programs that have a complicated linking dependency structure MONDO is able to run a graph reduction to eliminate loops and show struct linking dependencies. All three GUI interfaces work on both system platfroms for which MONDO is currently supported.

2.1 Solaris Features

The Solaris build of MONDO uses the dis command to dissasemble the previously parsed symbols.

To check what trace data is available on your platform, try: env LD_DEBUG=help ls.

2.2 Linux (x86) Features

The Linux (x86) build uses objectdump to accomplish the dissasembly routine that dis accomplishes under solaris.

3. FAQ

Below are the most fequently asked questions about how to use MONDO and all of its included features. If there is something that is not in the FAQ that you have a question about concerning the use of MONDO please email one of the authors.

3.1 Starting a Session

To start a session in MONDO simply type mondo on the command line followed by the program you wish to monitor. Alternatively you can load MONDO without specifying any program and use the menu system of the gui to load programs into MONDO. The default GUI for MONDO is GTK, however, MONDO offers users the ability to specify a different GUI for compatability. To use TK simply type the -tk flag. Alternatively for the curses interface uses the -curses flag.

3.2 Saving a Session

Saving a session in MONDO is dependant upon which GUI interface the user decides to work with. The instructions for each GUI are specified below.

3.2.1 Saving a Session using the GTK/TK Interfaces

Add FAQ stuff

3.2.2 Saving a Session using the Curses Interface

Add FAQ stuff

3.3 Loading a Session

Loading a session in MONDO is dependant upon which GUI interface the user decides to work with. The instructions for each GUI are specified below.

3.3.1 Loading a Session using the GTK/TK Interfaces

Add FAQ stuff

3.3.2 Loading a Session using the Curses Interface

Add FAQ stuff

3.4 Working with multiple Sessions

Loading multiple sessions as well as adding a new session to a currently loaded session in MONDO is dependant upon which GUI interface the user decides to work with. The instructions for each GUI are specified below.

3.4.1 Working with multiple Sessions using the GTK/TK Interfaces

Add FAQ stuff

3.4.2 Working with multiple Sessions using the Curses Interface

Add FAQ stuff

3.5 Generating a dependency graph

Add FAQ stuff

3.6 Generating a minimized dependency graph

Add FAQ stuff

4. Known Bugs