Re: Libprocstat printing warnings & errors

From: Mark Johnston <markj_at_freebsd.org>
Date: Wed, 13 Aug 2025 15:00:53 UTC
On Mon, Aug 11, 2025 at 11:18:52AM -0500, Andrew Wood wrote:
> Hi all,
> 
> Is it normal that a library will print errors/warnings in addition to setting an error/errno value on functions whose purpose isn't printing? I've been working with libprocstat lately and the program I'm writing is prone to checking processes that no longer exist a lot of the time (but is built to handle this), but I'm disappointed about the fact that I've seemingly got to choose between having my stderr riddled with warnings and disabling my ability to use the err/warn function suite (by calling err_set_file to set it to /dev/null).

Yes, I've noticed this too.  It's especially annoying because some of
the warnings are effectively unavoidable.  For instance, if one invokes
"procstat -kka", procstat will first obtain a list of processes and then
grab a stack for each one, but if one of the processes exits between
these two steps, libprocstat will emit a warning.  So if you run that
command on a busy system there's a good chance it'll emit some noise to
stderr.

It's bad behaviour for a library for sure.

> I'd much prefer if there were a separate function for finding out what an error was, like perhaps a procstat_strerror function? It seems perfectly doable given the state tracking that's already done in the procstat struct. Are there any design considerations to explain why a data-fetching would choose to print warnings without any request to, rather than let the programmer decide whether it's worth printing anything? Is this something I could change and make a PR for and just let any discussion over it happen there, or is there some person or group I need to talk to about this?

I think that makes sense on the surface, but how should the libprocstat
consumer know whether an error is benign or not?  Don't we also need
some finer-grained mechanism which makes it easy to distinguish
mostly-harmless errors (e.g., the target process exited) from something
more likely to be fatal (e.g., failure to query a particular process for
lack of permission)?  Probably libprocstat should expose error codes as
well?

> Apologies if this isn't the right spot to vent about this, I'm not sure where the proper place is.