libprocstat(3): retrieve process command line args and environment

Mikolaj Golub trociny at FreeBSD.org
Sat Mar 16 22:35:26 UTC 2013


On Sat, Mar 16, 2013 at 09:16:05PM +0200, Konstantin Belousov wrote:

> IMO sbuf_pad() should be moved to subr_sbuf.c. I find the KPI of
> the sbuf_pad() wrong. You have two separate number, the amount to
> pad to, and the current amount. Natural interface would take the
> two numbers separate instead of the difference. Also, could the
> sbuf_pad() deduce the current amount on its own, this would be the
> best ?

Hm, I am not sure about this.

So are you proposing instead of something like this

  sbuf_pad(sb, roundup(x, y) - x, 0);

to have

  sbuf_pad(sb, x, roundup(x, y), 0)?

Although it is a little easier to write, it looks less intuitive for
me.  E.g. I have troubles how to document this and explain. I can't
reffer x as a current position in sbuf, because it might not be. It is
just a some position, roundup(x,y) is another one, and only their
difference makes sence for sbuf_pad, so why not just to provide this
difference? So

  sbuf_pad(sb, from, to, c);

looks for me less intutive than

  sbuf_pad(sb, len, c);

A KPI that would be natural for my case: 

  /* start a section that is going to be aligned to sizeof(Elf_Size),
     using byte '0' for padding */
  sbuf_padded_start(sb, sizeof(Elf_Size), 0);
  /* write something to sbuf */
  sbuf_bcat(sb, data, len);
  /* align the sbuf section */
  sbuf_pad(sb);

This might look a little awkward and would add some overhead for the normal
case though...

> In register_note(), put spaces around '|' for the malloc line.
> 
> It seems that you did not moved the 'ABI hack' for ENOMEM situation for
> sysctl_kern_proc_filedesc() into the rewritten function.
>

Ah, this is a thing I wanted to discuss but forgot! As I understand
the idea of the 'ABI hack' is: if the output buffer is less than the
size of data we have, truncate our data to the last successfully
written kinfo_file structure and return without error.

In my code I do reset ENOMEM to 0 (see sysctl_kern_proc_filedesc), but
I don't see a way how using sbuf interface I can truncate req->oldidx
to the last successfully written file: sbuf_bcat() (to internal
buffer) may be successful and the error might appear only later, when
draining. I suspect it will break things if I return with a partial
kinfo_file, but haven't come with a solution yet...

> Please commit the changes to use pget() in the sysctl handlers separately.
> 
> Indents after the else clauses in kern_proc_out() are wrong.

Do you mean indents after '#ifdef COMPAT_FREEBSD32' block? I did it
that way so if COMPAT_FREEBSD32 sections were removed from the code
the indentation would be correct. I saw this practice through the code
and used it myself before.

> Since you are moving the KERN_PROC_ZOMBMASK out of kern_proc.c,
> a comment is needed to describe its usage. I would find it very
> confusing if grep reveals no like of code that sets the flags.
> 
> In the comment for sbuf_drain_core_output(), s/drainig/draining/,
> s/sefely/safely/ and s/hold/call us with the process lock held/.
> 
> I do not see much sense in the kstack note. The core is dumped when
> the threads are moved into the safe state in the kernel, so you
> cannot catch 'living' stack backtraces for the kernel side of
> things.

I was afraid of it after I had tried it on real dumps :-( Ok, will
remove the kstack note.

> On the other hand, things like umask, resources and osrel might be
> of the interest for post-morted analysis.

This is in my TODO list.

> I did not looked at the usermode changes.

Thanks for your suggestions! Will do them.

-- 
Mikolaj Golub


More information about the freebsd-hackers mailing list