Dynamic ddb commands
John Baldwin
jhb at freebsd.org
Mon Feb 2 10:44:46 PST 2009
On Monday 02 February 2009 11:17:41 am Matthew Fleming wrote:
> > In general it is far easier to just add sysinit's than to hack directly on
the
> > kernel linker. There are very few ddb commands, so one extra pointer or
two
> > per command is not a lot of space.
>
> Respectfully, I disagree, for several reasons.
>
> First, in order to make sysinit and sysctl work, the kernel linker
> needed to know that there are a set of elf sections that have special
> meaning. Yes, using sysinits means that there are still only two elf
> sections of interest.
Yes, that is precisely the point, to keep the special knowledge in the kernel
linker to a minimum. This is why kernel modules use sysinit's as well, and
thus device drivers, etc. The kernel linker is already a bit complex, and
I'd much prefer to keep non-linker related knowledge out of it as much as
possible.
> Second, as I mentioned before, having ddb commands added mixed in with
> sysinits means that, if I have a bug in my sysinit I may not be able to
> use some of my ddb commands to debug it. Even if DB_*COMMAND used
> SI_ORDER_FIRST, any sysinit with the same priority may come first.
You can still debug it, just not using your new commands. But actually, as
long as your sysinit's are after SI_SUB_KLD (as most of them are), then you
can still use your debugging commands just fine.
> Next, if you want commands sorted globally, it could be done with either
> implementation. But I think that commands that are defined by a module
> should be listed with others from that module.
Well, one of the "features" of ddb (IIRC) is that it allows "automatic"
nicknames in that if you have a 'reallylongname' command you can just
use 're' as an alias for it if 'reallylongname' is the only command that
starts with 're'. Handling that basically requires a sorted list. Also, if
you want to group commands in your module, that is easily accomplished by
using an appropriate namespace. E.g., prior to this when I used to use 'call
foo()' as a poor-man's substitute, I added commands to debug de(4) and had
them all start with 'tulip_*'. You could use a similar practice to group
your commands if desired.
> Last, changing struct command introduces a binary compatibility issue.
> Any older driver that had a ddb command (even if they never realized
> they couldn't access it) would need to be recompiled. I am not sure of
> FreeBSD's binary compatibility policy, though, and it would presumably
> be across a major OS revision number. So this is not a very compelling
> argument.
Correct, it is across major OS revisions, so it is ok to change it for 8.0.
--
John Baldwin
More information about the freebsd-hackers
mailing list