GDB is the GNU project's native debugger
Andrew Cagney
cagney@gnu.org
Tue Nov 30 16:26:00 GMT 2004
>>It's a complex problem and as such has middle ground and negotiation
>>dependant on the scale of the work:
>>
>>- Corinna recently changed an architecture interface and, since it was
>>straight forward, did the 'busywork'.
>>
>>- The frame code, on the other hand, was anything but straight
>>forward, it instead started with a single architecture and then
>>expanded as back end maintainers did their (much appreciated) stuff.
>>In the end though, a long list of architectures were simply deleted
>>(should I have instead done the 'busywork' of frameifying the ns32k?).
>>
>>Perhaps you can expand on your point by explaining where you would
>>strike up the balance for making an invasive change such as
>>asynchronous native (proc, ptrace) support. GDB has many many
>>non-async embedded targets, but only two natives. Should we predicate
>>the work on the modification of all the embedded inferiors? Or should
>>we accept that the work is so key to GDB's future as a native that we
>>can tolerate a few short term problems?
>
>
> I think that in general you expanded on my point better than I could.
> As you say, it's a complex problem. You are proposing a simple
> principle, and my concern is that once such a thing is adopted it will
> be used to enforce simplistic solutions to complex problems. As I
> said before, the principle itself seems unobjectionable in many
> contexts. My concern is that it will be applied in cases where it is
> too simple.
> Or, to put it another way: why do we need an overly simple statement
> about what we agree is a complex issue?
My post has context. I've recently encountered situtations where
developers were insisting that I test my changes on ULTRIX; or that I
seek approval when making trivial and pre-announced changes.
As such we all need a reality check. Remind ourselves what the overall
objective here is; and against what baseline we should each measure our
requests.
> On your specific issue, I think that async native support would
> require either a flag day or supporting two separate interfaces for
> some time. A flag day is only acceptable if all major architectures
> can be converted simultaneously. Off the cuff I would say that
> supporting two separate interfaces would have to last for at least a
> year. Yes, this is hard. Yes, it leads to more duplicated work. A
> clean and elegant program is a goal, but it is not the only goal.
I waited a year, and nothing happened.
I think it is first important to recognize that the pressure placed on
GDB is different to that encountered by other members of the toolchain -
binutils and gcc. GCC, for instance, has a simple pipeline
architecture: FRONTEND <tree> MIDDLEEND ... <tree> BACKEND. Individual
FRONT, MIDDLE and BACK ends can largely be developed in isolation, and
plugged in and out at will. Only when the <tree> is changed, as
occurred when moving from RTL to SSA, to things get scary and slow
careful engineering processes (as again applied to SSA) are required.
Contrast that to GDB, where underlying the architecture is a relatively
complex web of objects (there's an O-O model fighting to get out of the
C code :-). When developing such a model a key process has to be
refactoring the code - modifying the object model (changing
relationships and interfaces) so that the next change can be
accommodated - and a key attribute of refactoring is that each has a
short cycle: taking days, and not years to complete.
If we look over GDB's [short list of not so] recent core changes, we
find that for the true inovations such as:
- multi-arch started '98, not finished
- frames started dec? '02, finished nov '04
- event-loop started '98, finished jun? '04
- regcache started dec? '02, not finished
the innovator did (I pushed through 3/4 of the above) implement backward
compatibility so that out-of-date systems were given an opportunity to
update and consequently waited-a-year or more. When we examine how each
of these changes panned out, though - the extra year makes no
difference. Only when compatibility code starts to be removed (or I
stand my ground and require an update as an predicate to another
contributions) that we see activity to revive out of out-of-date systems
(and then only for a limited set).
You make the assertion:
> A clean and elegant program is a goal, but it is not the only goal.
We're not talking here about clean or elegant code. Rather we're
discussing GDB's backlog of refactorings (struct value, struct location,
struct symbol, ...); each made of many smaller changes; each
establishing another part of a robust OO model; each dependant on
earlier work; each ensuring a more maintainable code base; and most
importantly each a prereq to adding advanced features to gdb.
Such refactorings need to be performed in time periods that amount to
weeks, and not the months or years we currently see.
Is such a rate of change possible if we're required to constantly
schedule flag days, or wait for a year?
Andrew
More information about the Gdb
mailing list