public inbox for gdb@sourceware.org
 help / color / mirror / Atom feed
* [discuss] Support for reverse-execution
@ 2005-05-12 23:08 Michael Snyder
  2005-05-13  6:23 ` Eli Zaretskii
  2005-05-20 15:05 ` Vladimir Prus
  0 siblings, 2 replies; 80+ messages in thread
From: Michael Snyder @ 2005-05-12 23:08 UTC (permalink / raw)
  To: gdb

I'd like to start adding some commands to gdb to support targets
that can perform reverse execution (eg. stepping backwards).
This concept has been around for a number of years now, and I
have access to a target (the Simics simulator from Virtutech)
that does it quite handily.

I propose we add something like the following commands
(names open to discussion):

reverse-continue -- start executing backwards until something
interesting happens (most likely hitting a breakpoint).

reverse-stepi -- "un-execute" the previous instruction.

reverse-step -- "un-execute" the previous source line.

reverse-finish or "un-call" -- proceed backward until 
the current function is about to be called by its caller.

reverse-until... etc.

Along with these commands, we would need at least two new
remote-protocol messages: "rc" for reverse-continue, and "rs" 
for reverse-stepi.  I think all of the above user commands could
be implemented on these primatives.  Obviously if the remote
target doesn't understand these primatives, the user command 
would error.

Finally, we'd need a new entry for the target vector --
something like "to_resume_backwards".  If the target vector
doesn't export this method, the user command would error.

At least one target (the Simics simulator) would support these
commands immediately, and once they exist, their presence may
encourage other targets to implement reverse execution.  We know
that the technology exists, it just needs a user interface to be useful.

Comments?

Michael Snyder
Red Hat

^ permalink raw reply	[flat|nested] 80+ messages in thread
* Re: [discuss] Support for reverse-execution
@ 2005-05-16 17:47 Dan Shearer
  2005-05-16 18:04 ` Dan Shearer
  2005-05-20 18:15 ` Daniel Jacobowitz
  0 siblings, 2 replies; 80+ messages in thread
From: Dan Shearer @ 2005-05-16 17:47 UTC (permalink / raw)
  To: gdb

On Thu, 12 May 2005 16:08 Michael Snyder wrote at
http://sources.redhat.com/ml/gdb/2005-05/msg00145.html

> I'd like to start adding some commands to gdb to support targets
> that can perform reverse execution (eg. stepping backwards).
> This concept has been around for a number of years now, and I
> have access to a target (the Simics simulator from Virtutech)
> that does it quite handily.

I'm from Virtutech and I'd just like to put some context around this to
make the case that a reversible gdb is a very powerful tool, not just a
curiosity and certainly not specific to one company's simulator.
Reversibility takes some getting used to, so please bear with me for a
long-ish message.

Virtutech's Simics is a simulator, it does go backwards, and every
hacker who's seen it gets as excited as Michael. Simics has a debugger,
but it isn't as capable as gdb (by design) and Virtutech wants to
encourage the existance of a gdb that does reversibility.  Simics
already has a gdb stub. So that's why Virtutech is here on this list.

Personally I think reversibility is the biggest advance in debugging
since source code debugging. We've got massive and complicated codebases
we're working with today and we need better productivity.  Projects like
KDE, Samba and OpenOffice use valgrind+gdb. With reversibility
productivity will improve even more, I can't make valgrind reversible
but I can help with gdb. That's why I'm here in a personal capacity.

When Reversibility Becomes Useful
---------------------------------

From what I've learned with Simics, reversibility becomes a generally
useful technique when both the simulator and the problem have certain
characteristics.

The simulator needs to be able to save state universally on a networked
world of disparate computers and other electronic devices. If a whole
universe can't be run backwards including diagnostic tools running
inside the universe then reversibility loses a lot of its benefit. The
simulator must also be fast enough to debug problems in real time:
booting an OS must be reasonably quick, for example. And running
backwards must not be slow either, or debugging becomes frustrating

One benefit to the party trick of unbooting a binary-only OS is to see
whether it unboots nearly as quickly as it boots. If it does, chances as
this is reversible hardware that will improve your debugging a lot.

Reversibility helps debugging when the problem:

1. depends on rare circumstances related to a complicated network
environment, and/or

2. involves multiple large, unrelated codebases where the aggregate
behaviour is unpredictable, and/or

3. timing considerations are vital and the inputs are non-deterministic


Reversible Hardware Options
---------------------------

Right now the only fast and complete reversible hardware solution is
Simics, however there is a lot of work happening in the field.

More than a year ago CoVirt project (http://www.eecs.umich.edu/CoVirt/ )
implemented a logging/playback facility for User Mode Linux and modified
gdb to use this to provide reversible execution and debugging. The
project website has a paper titled "Debugging operating systems with
time-traveling virtual machines" that illustrates the point very well.

Around 1999 Cygnus' GPL SID simulator could execute backwards.
Development on reversibility didn't continue so I'm told because it was
seen as "party tricks". Besides SID had flexible hardware watchpoints
like "stop the CPU when an ethernet interrupt is fired" which reduced
the need to search for a particular point in execution for SID's
intended users.

There have been discussions around most of the free simulators talking
about how reversibility could be implemented. I'd guess QEMU is a likely
candidate from the interests of some of the contributors. Valgrind is
another obvious possibility.

The commercial Green Hills Time Machine system instruments real hardware
and then provides an interface for debugging it via Green Hills'
debugger that steps anywhere in the execution history of the hardware.
This might be like Michael Snyder's Tracepoints facility in gdb taken to
an extreme (I haven't used either.)

According to the prior art research done for the Simics Hindsight
whitepaper at http://virtutech.com, reversible hardware has been seen as
doable for over 30 years. Part of the problem has been in implementing
it in a very fast and general way, and the other part has been in
working out why it is so useful.

Current Availability
--------------------

Nobody outside Virtutech has access to Simics reversibility. Simics
Hindsight is due to go into (non-public) beta fairly soon. As part of
this, Virtutech has modified the Simics gdb stub so it can talk to a gdb
that supports reversibility, but this is also in-house for now. So while
Virtutech wants to have a discussion about making its closed-source
simulator available to the kinds of people who live on this list, nobody
has it yet.

Hopefully that explains what reversibility is, why it is important, and
why it is a very significant capability.

-- 
Dan Shearer
dan@shearer.org

^ permalink raw reply	[flat|nested] 80+ messages in thread
* Re: [discuss] Support for reverse-execution
@ 2005-05-19  1:23 Dan Shearer
  2005-05-19 13:01 ` Johan Rydberg
  2005-05-20 10:47 ` Eli Zaretskii
  0 siblings, 2 replies; 80+ messages in thread
From: Dan Shearer @ 2005-05-19  1:23 UTC (permalink / raw)
  To: gdb

Johan Rydberg, a developer at Virtutech, has got some patches against
6.3 (for discussion only) that he'll be sending along to this list. I
want to bring up bookmarks for discussion, a topic that isn't yet
addressed by his patches.

First, what is addressed: Johan has implemented the reverse instructions
rstep, rstepi, rnext and rnexti for PowerPC, Sparc and Sparc64 targets.
Next to appear will be rcontinue (easy) and rfinish (not so easy),
however all of these are obvious reversible analogues to the
conventional commands. You should see these when Sweden wakes up next.

Bookmarks are not about reversibility, they are about checkpointing.

To understand bookmarks you first have to think about what a reversible
target is. Any simulator (or real hardware for that matter) capable of
reversibility has a mechanism to keep or re-generate all system state
and the ability to restart execution from any point in that stored
state. Bookmarking is a way of exposing this functionality to the user.

Imagine two new gdb commands, get-bookmark and goto-bookmark.
get-bookmark asks the simulator for a token which uniquely identifies
the current state of the system. goto-bookmark gives a token back to the
simulator and asks the simulator to load system state as it was at the
time of the bookmark. The token is an arbitary number that makes sense
to the particular simulator. Some might count in clock cycles, others in
milliseconds or maybe the number of the checkpoint that corresponds to
the state at that time. All gdb knows about is the value of the
bookmark.

This gives a gdb user the capability to explore alternative futures
without a complicated interface. A sequence might be get-bookmark,
change a value, run for ten seconds. Break, goto-bookmark, try another
value and run for ten seconds. Like an infinite rewind-replay facility,
very helpful when part of the pain is getting the circumstances just
right for the bug to appear.

It would be an interesting discussion to see how bookmarks could be
incorporated into the gdb framework.

-- 
Dan Shearer
dan@shearer.org

^ permalink raw reply	[flat|nested] 80+ messages in thread
* Re: [discuss] Support for reverse-execution
@ 2005-05-20 15:49 Paul Schlie
  2005-05-20 17:41 ` Dan Shearer
  2005-05-20 20:58 ` Michael Snyder
  0 siblings, 2 replies; 80+ messages in thread
From: Paul Schlie @ 2005-05-20 15:49 UTC (permalink / raw)
  To: Daniel Jacobowitz, Eli Zaretskii, Michael Snyder, gdb

Alternatively to attempting to specify an interface to a lone commercial
reversible simulator, or presume the intelligence need be "remote" to GDB;
I wonder if it may be more sensible to consider initially defining the basic
generic facilities by which GDB may directly support undoable/reversible
execution, and checkpoint features.

More specifically, as ISA semantics do not generally have deterministic
reciprocal semantics, it's only possible to support reverse execution
by literally being able to either maintain a list of all state changes
associated with each instruction/command's execution and unwind them,
and then optionally proceed forward again.

Therefore it seems likely sufficient to initially begin by defining
support for the following core facilities:

Basic GDB support for check pointing and reverse execution:

- enable-checkpoints: initializes machine state and program memory to
  all 0's upon prior to program startup/initialization. (see below)

- save-checkpoint [Optional-Name] => checkpoint [N [Optional-Name]],
  saves a diff between the programs present state and it's previous
  state, and marks the current undo-state diff (see below) as being
  equivalent to this checkpoint.

- restore-checkpoint [N | Opional-Name]; sets machine and memory state
  to the cumulative difference between all 0's and the designated
  checkpoint diff. [this is insensitive to the target's stub supporting
  state-diff, as GBD is responsible for storing and computing state-point
  restores on behalf of the target]

- enable-undo/reverse: sets flag to request state-diff from target
  stub upon (step, next, etc.) commands.

- (step, next, etc.): as normal, but requests the state-diff from the
  target stub between successive command executions if reverse-execution
  flag is enabled. (This may also be supported without target stub support
  for state-diff, as GDB has direct access to both the target's machine
  state, and memory state; although target stubs may likely be capable
  of more efficient diff's if they are capable of tracking memory updates
  more efficiently than simply looking after the fact.)

- undo/reverse: undoes/reverses the previously issued command, by
  un-diff'ing the present machine and memory state with the previously
  returned diff. (which is likely sufficient and substantially more time
  and resource efficient than attempting to otherwise effectively
  single-step record all intervening individual instruction execution
  diff's, which could also be enabled if desired, although likely not
  necessary in general.)

Basic Target stub facilities to improve reverse execution efficiently:

- state-diff: the target returns the diff between the target's present
  state and it's previous state, which may be used if available in lieu
  of GDB directly calculating machine and memory state diffs, but would
  likely only be substantially more efficient if the target stub were
  capable of more efficiently tracking and accumulating diffs by directly
  monitoring memory state changes, rather than determining them after
  the fact, as may be done likely efficiently by a target simulator and
  then simply communicated by publishing the cumulative diffs as requested
  by GDB; which seems nice and simple, and minimally invasive.)


^ permalink raw reply	[flat|nested] 80+ messages in thread
* Re: [discuss] Support for reverse-execution
@ 2005-05-20 19:02 Michael Snyder
  2005-05-20 20:43 ` Eli Zaretskii
  0 siblings, 1 reply; 80+ messages in thread
From: Michael Snyder @ 2005-05-20 19:02 UTC (permalink / raw)
  To: gdb; +Cc: Eli Zaretskii

 >> +extern enum step_direction_kind step_direction;
 >
 > Yuk! a global variable!

That's entirely typical, Eli, for a "set/show" mode variable.


^ permalink raw reply	[flat|nested] 80+ messages in thread
* Re: [discuss] Support for reverse-execution
@ 2005-05-20 21:11 Michael Snyder
  2005-05-20 21:27 ` Daniel Jacobowitz
  0 siblings, 1 reply; 80+ messages in thread
From: Michael Snyder @ 2005-05-20 21:11 UTC (permalink / raw)
  To: gdb, Eli Zaretskii, Daniel Jacobowitz

In regards to the question "where does a reverse-step put you?"
(ie. at the beginning of a line, or somewhere in the line):

 > Sorry, I'm confused.  Isn't it right that if I'm stepping
 > backwards through code such as this:
 >
 >    i += 1;
 >    foo (i);
 >  =>i = 0;
 >
 > where "=>" shows the current source line, then typing `rnext'
 > once will get me to this:
 >
 >    i += 1;
 >  =>foo (i);
 >    i = 0;
 >
 > which means I'm now before the CALL insn that calls `foo'?

I agree with this interpretation.  If I am a user (and I am),
and I were to say:
     (gdb) step
     (gdb) reverse-step (or whatever)
I would expect to be back where I started, ie. at the
*beginning* of the original line.

Dan J. has said that we might need to reverse-stepi until
we've gone back one too many, and then do a forward step.
I agree.  In fact, I think it will be necessary to do
the following:

     (gdb) reverse-step
     # reverse-stepi once (or until we leave the *current* line)
     # now establish the step-range start and end (prev line)
     # reverse-stepi until we leave the prev line
     # stepi once to get back to the desired line.

^ permalink raw reply	[flat|nested] 80+ messages in thread
* Re: [discuss] Support for reverse-execution
@ 2005-05-20 21:16 Michael Snyder
  2005-05-20 21:31 ` Daniel Jacobowitz
  2005-05-21  9:39 ` Eli Zaretskii
  0 siblings, 2 replies; 80+ messages in thread
From: Michael Snyder @ 2005-05-20 21:16 UTC (permalink / raw)
  To: Daniel Jacobowitz, gdb

 >> It would be an interesting discussion to see how bookmarks could be
 >> incorporated into the gdb framework.
 >
 > Sounds like a very useful feature.  However, I think we need to
 > support giving meaningful names to bookmarks, since a (more or less
 > arbitrary) number used by the target is going to lack any mnemonic
 > value.

How about counting numbers, like we do with breakpoints?

     (gdb) get-bookmark
     Bookmark #1, line 12, foo.c == <quasi-random-identifier>
     (gdb) continue
     Breakpoint 5, line 144, grbx.c
     (gdb) info bookmarks
     Bookmark   ID    Location
     1          <###> foo.c line 12
     (gdb) goto-bookmark 1
     Line 12, foo.c (bookmark <quasi-random-identifier>)



^ permalink raw reply	[flat|nested] 80+ messages in thread
* Re: [discuss] Support for reverse-execution
@ 2005-05-20 21:25 Michael Snyder
  0 siblings, 0 replies; 80+ messages in thread
From: Michael Snyder @ 2005-05-20 21:25 UTC (permalink / raw)
  To: Dan Shearer, gdb

 > In general I really like the idea of GDB better catering to
 > non-remote simulators. You'll notice that almost none of the
 > whole-system simulators in the free software world have
 > integrated debugging and I'd >love to make that easier.

Traditionally, that's how we used to do it, and we still can
(see src/sim).  I think we've tended in the direction of letting
the sim be a separate program because sims like SID are so big.
Linking them in to gdb would make both huge.

The approach of using the remote protocol is very flexible.
The debugger and the sim can be running on the same host,
or on opposite sides of the planet.  If they're on the same
host, running packets thru a socket really doesn't slow us
down all that much.  But there is a function-call interface
for linking gdb to a sim if its wanted.



^ permalink raw reply	[flat|nested] 80+ messages in thread
* Re: [discuss] Support for reverse-execution
@ 2005-05-20 21:44 Michael Snyder
  0 siblings, 0 replies; 80+ messages in thread
From: Michael Snyder @ 2005-05-20 21:44 UTC (permalink / raw)
  To: gdb, ghost

 > Would not it be better to have a single "reverse" command which
 > puts the debugger in "reverse" mode -- making step/stepi/next/nexti
 > go backward.
 >
 > This might be handier for UI -- after all "step" can be abbreviated
 > as 's', but reverse-step can't be abbreviated. This might be better
 > in GUI too -- instead of doubling the number of "step" commands
 > you'd have a single "gear" switch, that can be in either "forward"
 > or "reverse" position.
 >
 > - Volodya

I'm certainly not opposed to that, although I lean a bit more
toward the separate "analogue" commands.

Fortunately, command interface is easy to implement.
Maybe we will float several independant patches that
each implement a different CLI to the same functionality,
so we can try them all out and get a feel for them.

^ permalink raw reply	[flat|nested] 80+ messages in thread
* Re: [discuss] Support for reverse-execution
@ 2005-05-20 21:51 Michael Snyder
  2005-05-21  9:44 ` Eli Zaretskii
  0 siblings, 1 reply; 80+ messages in thread
From: Michael Snyder @ 2005-05-20 21:51 UTC (permalink / raw)
  To: gdb

 >>> Would not it be better to have a single "reverse" command which
 >>> puts the debugger in "reverse" mode -- making step/stepi/next/nexti
 >>> go backward.
 >>
 >> Daniel, I rest my case ;-)
 >
 > I don't rest mine :-)  I admit I was a little surprised to see
 > someone else suggest it, but I still think it's an awful idea as
 > a user interface.

Make me a third person who thought of it independantly.

Look at it this way -- once we've implemented the reverse-x
command set, adding this would be trivial; just a single
set/show mode variable.  Then we could evaluate both, or even
leave it to the user to choose.



^ permalink raw reply	[flat|nested] 80+ messages in thread
* Re: [discuss] Support for reverse-execution
@ 2005-05-20 21:59 Michael Snyder
  0 siblings, 0 replies; 80+ messages in thread
From: Michael Snyder @ 2005-05-20 21:59 UTC (permalink / raw)
  To: dan, gdb

 >>     (gdb) reverse-step
 >>     # reverse-stepi once (or until we leave the *current* line)
 >
 > BTW, this bit is a little more complicated, because we might go
 > to another frame.  So we might have to do some reverse-finish's
 > stacked in there.

Absolutely -- I just wanted to focus on the one point.

 > I think infrun will need some serious cleaning
 > up to pull this off.

infrun *always* needs serious cleaning up.   ;-)

Seriously, though, we'll have to add some new state,
but I think it's doable without major rewriting.

^ permalink raw reply	[flat|nested] 80+ messages in thread
* Re: [discuss] Support for reverse-execution
@ 2005-05-20 22:11 Michael Snyder
  2005-05-20 23:32 ` Paul Schlie
  0 siblings, 1 reply; 80+ messages in thread
From: Michael Snyder @ 2005-05-20 22:11 UTC (permalink / raw)
  To: schlie, gdb

 >>> or presume the intelligence need be "remote" to GDB;
 >>
 >> We're not doing that either -- the user interface makes no
 >> assumption about the target interface.
 >
 > - Then there seems no need to define a reverse-xxxx set of commands
 > at the GDB/target-stub boundary (unless I misunderstand the purposed
 > of the earlier threads of dialog)?

<tag-dont-take-this-as-criticism>
The user interface makes no *assumption* about the target
interface, but that doesn't mean that the target doesn't
*also* need an interface.  Both have been discussed in this
thread, but they're not tied together.

We have, for instance, discussed six or seven user commands
(not counting bookmarks), but AFAIK only two target interface
commands should be needed to support them -- "rc/bc" and "rs/bs".

There's a third interface we've discussed too -- the interface
between core-gdb and the target or back-end component (eg. but
not limited to remote.c).  We might, for instance, add a single
new method to the target vector, eg. "to_resume_backwards"
(or we might just add a direction parameter to the existing one).
That method could then be added to, for instance, target sim.

All that said, I'm not taking issue with your idea.
I do think there might be a generic way for gdb to
do something like dropping a checkpoint.  I just don't
think its mutually exclusive with this discussion.

If you want to propose it in a separate thread, I'd be
thrilled to talk about it.

^ permalink raw reply	[flat|nested] 80+ messages in thread
* Re: [discuss] Support for reverse-execution
@ 2005-05-21 15:53 Paul Schlie
  0 siblings, 0 replies; 80+ messages in thread
From: Paul Schlie @ 2005-05-21 15:53 UTC (permalink / raw)
  To: Russell Shaw, gdb

> Russell Shaw <rjshaw at netspace dot net dot au> writes:
> Yes, that's what i meant (every step). It could be configureable so
> that the policy can be set to every user-stop, every function call,
> or disabled alltogether. The idea is that you could run from main()
> until a segfault happens, then "back 10" and step thru the last few
> actions.

There's nothing inherently wrong with the strategy, as long as one
understands that the utility it provides can be deceptive; for example
given the following simple program fragment:

void foo(void)
{
   x = the_real_problem();
   for (int i = x, i != 0, ++i)
   {
     something();
   }
}

foo();  // step from here.
... ;   // to here.

It's clear that tracing and recording the last N states can easily
be consumed in uninteresting code.

A similar strategy may constrain the N full state traces/snapshots
to only entries into basic blocks, which both allows N to be smaller,
while simultaneously enabling a broader swipe of interesting locations
to recorded for subsequent inspection. This ideally either requires that
the compiled program be analyzed to apriority identify these entry points,
although a close approximation may be determined at runtime by only
recording state traces at points of control flow change; i.e. capture and
record state only upon a given condition, (typically when the PC != PC + 1,
for example), or may be generalized to any arbitrary set of "watch-point"
conditions; as an incremental nicety, not unlike the HW trace history buffer
support that some processors provide. (and could be enabled by GDB directly,
with or without target support)


^ permalink raw reply	[flat|nested] 80+ messages in thread

end of thread, other threads:[~2005-05-23 19:39 UTC | newest]

Thread overview: 80+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-05-12 23:08 [discuss] Support for reverse-execution Michael Snyder
2005-05-13  6:23 ` Eli Zaretskii
2005-05-19 13:46   ` Daniel Jacobowitz
2005-05-19 18:46     ` Michael Snyder
2005-05-19 19:26       ` Johan Rydberg
2005-05-20 10:55     ` Eli Zaretskii
2005-05-20 13:04       ` Daniel Jacobowitz
2005-05-20 14:30         ` Eli Zaretskii
2005-05-20 14:43           ` Andreas Schwab
2005-05-20 20:48         ` Michael Snyder
2005-05-20 20:51           ` Daniel Jacobowitz
2005-05-20 20:38     ` Michael Snyder
2005-05-20 15:05 ` Vladimir Prus
2005-05-20 15:58   ` Eli Zaretskii
2005-05-20 18:14     ` Daniel Jacobowitz
2005-05-20 18:30       ` Eli Zaretskii
2005-05-20 19:27   ` Stan Shebs
2005-05-16 17:47 Dan Shearer
2005-05-16 18:04 ` Dan Shearer
2005-05-20 18:15 ` Daniel Jacobowitz
2005-05-21  0:05   ` Frank Ch. Eigler
2005-05-21 10:13     ` Eli Zaretskii
2005-05-21 10:28       ` Russell Shaw
2005-05-21 12:38         ` Eli Zaretskii
2005-05-21 12:55           ` Russell Shaw
2005-05-21 14:39           ` Russell Shaw
2005-05-21 14:19       ` Daniel Jacobowitz
2005-05-21 15:46         ` Eli Zaretskii
2005-05-21 17:43           ` Daniel Jacobowitz
2005-05-23 19:39             ` Dan Shearer
2005-05-19  1:23 Dan Shearer
2005-05-19 13:01 ` Johan Rydberg
2005-05-19 13:18   ` Daniel Jacobowitz
2005-05-19 13:47     ` Johan Rydberg
2005-05-20 10:37   ` Eli Zaretskii
2005-05-20 11:37     ` Andreas Schwab
2005-05-20 13:18       ` Daniel Jacobowitz
2005-05-20 13:36         ` Fabian Cenedese
2005-05-20 13:47           ` Daniel Jacobowitz
2005-05-20 14:41       ` Eli Zaretskii
2005-05-20 22:14         ` Daniel Jacobowitz
2005-05-20 12:22     ` Johan Rydberg
2005-05-20 13:19       ` Daniel Jacobowitz
2005-05-20 14:12       ` Eli Zaretskii
2005-05-20 13:14     ` Daniel Jacobowitz
2005-05-20 14:34       ` Eli Zaretskii
2005-05-20 15:40       ` Johan Rydberg
2005-05-20 10:47 ` Eli Zaretskii
2005-05-20 15:49 Paul Schlie
2005-05-20 17:41 ` Dan Shearer
2005-05-20 22:01   ` Paul Schlie
2005-05-20 22:08     ` Daniel Jacobowitz
2005-05-20 22:43       ` Paul Schlie
2005-05-21  0:58         ` Daniel Jacobowitz
2005-05-21  1:42           ` Paul Schlie
2005-05-21  1:53             ` Daniel Jacobowitz
2005-05-21  1:56               ` Daniel Jacobowitz
2005-05-21 15:03                 ` Paul Schlie
2005-05-21 14:13               ` Paul Schlie
2005-05-21 14:23                 ` Daniel Jacobowitz
2005-05-21 15:04                   ` Paul Schlie
2005-05-20 20:58 ` Michael Snyder
2005-05-20 21:35   ` Paul Schlie
2005-05-20 19:02 Michael Snyder
2005-05-20 20:43 ` Eli Zaretskii
2005-05-20 21:03   ` Michael Snyder
2005-05-20 21:11 Michael Snyder
2005-05-20 21:27 ` Daniel Jacobowitz
2005-05-20 21:16 Michael Snyder
2005-05-20 21:31 ` Daniel Jacobowitz
2005-05-21  9:39 ` Eli Zaretskii
2005-05-23 18:19   ` Michael Snyder
2005-05-20 21:25 Michael Snyder
2005-05-20 21:44 Michael Snyder
2005-05-20 21:51 Michael Snyder
2005-05-21  9:44 ` Eli Zaretskii
2005-05-20 21:59 Michael Snyder
2005-05-20 22:11 Michael Snyder
2005-05-20 23:32 ` Paul Schlie
2005-05-21 15:53 Paul Schlie

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).