DragonFly On-Line Manual Pages
xmon(1) DragonFly General Commands Manual xmon(1)
NAME
xmon - interactive X protocol monitor
SYNOPSIS
xmonui [ options ] | xmond [ options ]
DESCRIPTION
Xmon interactively monitors the byte-stream connections between an X
server and a number of X clients. Xmon recognizes all requests, events,
errors and replies sent between the clients and the server which are
part of the core X protocol. The contents of these messages are
displayed on standard output at a user settable degree of detail from
none to every bit and byte. Xmon also allows the user to select a
number of requests or events to be monitored at a different degree of
detail. Xmon will also block the transmission of selected requests
from the clients to the server and selected events from the server to
the clients. Xmon also keeps statistics of the number of requests,
events, and errors received.
Xmon is made up of two separate processes. The core of xmon is xmond
which monitors the X protocol streams and displays the protocol
messages on standard output. The interactive interface is handled by
xmonui. These two processes communicate via a pipe from the standard
output of xmonui to the standard input of xmond.
The following diagram shows the relationships between xmonui and xmond,
and the clients and the server.
----------
| xmonui |
----------
|
v
------------ ----------
| client 1 |<------->| |
------------ | | ----------
: | xmond |<----->| server |
: | | ----------
------------ | |
| client n |<------->| |
------------ ----------
|
v
monitor output to stdout
In the diagram the vertical connections are pipes and the horizontal
connections are normal X socket connections.
Xmond sits transparently between the X clients and an X server. To the
clients it behaves just like an X server and to the server it behaves
just like a number of X clients.
OPTIONS TO XMOND
-server display_name:display_number
This option sets the X display which xmond connects to.
display_name can be a name or numerical network address. The
default for both values is the value of the DISPLAY environment
variable. If this is not set, then the default for display_name
is the local host and the default for display_number is 0. If
display_number is positive, the real port number is determined
by adding it to the base X server port number, 6000, just as is
done for standard X servers. If it is negative, the real port
number is the absolute value of display_number. A negative
value may be useful when using xmond as a general purpose tcp/ip
monitor and the byte stream being monitored does not obey the X
protocol.
-port display_number
This option sets the port on which xmond listens for client
connections. This port is always on the host where xmond is
running. Default is 1. The real port number is determined in
the same way as for the -server option.
-verbose verbose_level
This option sets the amount of output initially produced by
xmond for each request, reply, event or error received. The
values are 0 (off), 1 (names), 2 (main), 3 (full), 4 (hex).
Default is 0. The meaning of each value is described in the
USER INTERFACE section.
-raw If this option is given, xmond simply acts as a tcp/ip monitor,
passing bytes from one side to the other without parsing the
stream. By default, it prints the hexadecimal value of each
byte passed. This behaviour may be altered by using the -ascii
or -noprintraw options.
-ascii If this option is given, dumps are printed as ascii characters,
except for unprintable characters, which are printed as
hexadecimal, escaped with a '\'. This is useful with the -raw
option.
-noprintraw
If this option is given with the -raw option, xmond does not
print anything.
-packet_size
If this option is given, xmond initially prints the size of each
block of data received from the clients and server.
-raw_size
Print size of traffic only. Equivalent to "-packet_size -raw
-noprintraw".
OPTIONS TO XMONUI
Xmonui accepts all of the standard X Toolkit command line options. In
particular
-display display_name:display_number
Indicates where to display the user interface window.
EXAMPLES
1) To monitor connections made to the local host use the following
command line
xmonui | xmond
Connections made to the display localhost:1 will appear on the display
localhost:0. The xmonui user interface will appear on the display
localhost:0.
When starting up the application that you want to monitor, be sure to
set it's display correctly. When you normally start up an X
application, and if you have not done anything special, it will by
default start up on display 0 of your local host. But xmon by default
is listening as if it is display 1 of your local host. Assuming your X
application is called "myclient" and your local host name is "dolphin"
then type the following to start up your application:
myclient -display dolphin:1
Another way to do the same thing is to change the DISPLAY environment
variable. If you are using a C shell you can do this:
setenv DISPLAY dolphin:1
myclient
If you are not using a C shell, you may have to do something different
to change the DISPLAY environment variable. Also, most clients
understand the -display option, but there are those that do not. To
determine the name of your local host try the hostname command
(although it may not be available on all machines).
2) If you are on the host squiggle which has two X servers using the
displays squiggle:0 and squiggle:1, and want to monitor connections
made to the server running on the display juggler:0, enter the
following command line.
xmonui -display squiggle:0 | xmond -server juggler:0 -port 2
Connections now made to the "display" squiggle:2 will appear on the
display juggler:0. The xmonui user interface will appear on the
display squiggle:0. Monitor output will appear in the window where the
command was entered.
3) A good way to view the output of xmon is to pipe it through xless,
which allows you to scroll and search through the output interactively.
For example:
xmonui | xmond | xless -f
THE USER INTERFACE
The user interface is divided into four parts: output detail,
statistics, selected requests and selected events.
In the output detail section, the amount of detail contained in the
output of xmon can be selected. Different levels of detail can be
selected for each of the message types: requests, events, errors and
replies. The meaning of each level is as follows.
off No monitor output is produced.
names Only the names of the messages are output.
main The most interesting fields of the message are output.
full All fields of the message are output.
hex All fields of the message are output, as well as a hexadecimal
dump.
The detail setting for errors also applies to the following: setup
messages sent at client connection; the end-of-file "message" sent at
client shutdown; unknown extended messages; and unexpected replies. If
xmon receives a request, reply, event or error which it does not know
how to handle, and if the detail setting for errors is "hex", then the
message will be dumped in hexadecimal. Similarly, if xmon receives a
reply for which it did not send a corresponding request, and the detail
setting for errors is "hex", then the reply will be dumped in
hexadecimal.
Note that synthetic events (events sent by XSendEvent) are monitored in
the same way as normal events but are identified as being "SYNTHETIC".
Also in this section is the show packet size toggle. If this is turned
on, xmon will display the size of each packet received from both
clients and servers. The file descriptor of the client or server which
sent the packet is also displayed. The first client file descriptor is
4. File descriptors 0, 1 and 2 are used by standard input, standard
output and standard error and file descriptor 3 is where xmon listens
for new connections.
In the statistics section, the counting of requests, events and errors
can be controlled as follows.
start Enable the taking of statistics.
stop Disable the taking of statistics.
clear Clear the counts for this message group.
print Print the name and number of occurrences of each message in this
group, excluding messages received zero times.
print zero
Print the names of messages in this group that have been
received zero times.
In the selected requests section, selected requests can be monitored at
a different level of detail, or can be blocked from transmission.
Requests can be selected by clicking on their names in the scrollable
list. Clicking again de-selects the request. Selected requests are
indicated by an asterisk (*) in the scrollable list.
The detail toggle is of the same form as in the output detail section,
but applies only to those requests selected in the left scrollable
list.
If the blocking toggle in set to on, all selected requests in the right
hand scrollable list are blocked by xmon. They are not forwarded to
the server, although they are monitored and counted normally. If the
blocking toggle in set to off, all requests are forwarded to the
server.
The selected events section is similar to the above section but deals
with events received from the server.
USING XMOND WITHOUT XMONUI
Normally xmonui is used as an interactive interface to xmond. However,
for some testing procedures it may be better to run xmond by itself
initialising it with some standard setup. The interface between xmonui
and xmond is made up of simple ascii strings. Pressing buttons on
xmonui causes it to write these strings to standard output which are
then usually read by xmond. You can just run xmond by itself and type
in the strings, or, even better, use a file as input to xmond. There
are too many strings to list here, but if you run xmonui by itself, you
will see the strings being printed to standard output. Run
xmonui > command.file
to create a file of strings that can be used as input to xmond. For
example, a file which will cause xmond to monitor the Bell request and
also print the names of all events would contain the lines:
monitor_request_on 104
event_verbose 1
Running
xmond < command.file
will then set up xmond in the same way each time. Note that when
running xmond by itself, it does not exit on reading end-of-file and so
it must be killed. (I use CONTROL-C to kill. Your kill character may
be different.)
It is also possible to initialise xmond with a file, and then take
further commands from xmonui by running
xmonui | cat command.file - | xmond
The cat command first sends the command.file to xmond and then passes
the output of xmonui to xmond. Please note that in this case xmonui
will not show the new state of xmond correctly. For example, xmonui
starts up assuming that no requests have been selected, even if the
command.file has initialised xmond by selecting some requests. This
inconsistency does not effect the usability of xmon but may be
confusing.
The string
quit
will cause xmond to exit, so make sure that this does not occur in any
input file. Also it is meaningless to use the statistics commands from
within an input file because these will be read before any X clients
have connected.
EVENT RECORDING AND PLAYBACK
Xmon contains an unfinished attempt at event recording and playback.
It is fairly crude and does not work properly. If you are interested
in exploring it and perhaps doing some more work on it, please try it
out. To compile it in, you will need to modify the Imakefile as
suggested in the comments.
To try it out, first run xmond with the -record option and with
standard output redirected to a file. The -record option causes xmon
to write, to standard output, a log of all user events it receives.
Run an X client through xmond and interact with it. The mouse and
keyboard events will be logged to the file. Now kill that invocation
of xmond.
Now run xmond with the -play option and with standard input redirected
from the event log file just produced. Now run the same X client as
before, but do not interact with it. The client should receive events
from xmond according to the log file and behave in the same way as
before.
The events are played back at the same speed as when recorded (thanks
to code contributed by Marc Vertes). The algorithm used to decide when
the client is ready to receive the next event is faulty and can
sometimes wait forever. It simply counts the number of ImageText8 and
PolyText8 requests that are received and records the counts with each
event in the log file. During replay, an event is sent to the client
when the matching number of requests have been received.
For example, to record and playback a simple xterm session:
xmond -record > foo
(then run xterm through it, typing a few commands)
(exit xterm and kill xmond)
xmond -play < foo
(now run xterm through it again)
It half works. Good luck.
BUGS
No provision is included for extensions to the base protocol.
Xmon only handles TCP socket connections. UNIX domain sockets and
DECnet are not supported.
There should be a better way of initialising the state of xmond and
having this new state reflected in xmonui.
Because of the security method used by your X server, it may reject
connection attempts made by xmond. A work-around is to run
xhost +
to force the X server to accept all connections.
SEE ALSO
X(1)
X Window System Protocol, MIT X Consortium Standard, X Version 11,
Release 4, by Robert W. Scheifler.
AUTHORS
Greg McFarlane, OTC, Australia, from the xscope program written by
James L Peterson, MCC.
Please send any bug reports or modifications to
gregm@iname.com
X Version 11 30 March 1996 xmon(1)