Date: Sat, 26 Nov 2011 18:43:01 +0200 From: Mikolaj Golub <trociny@freebsd.org> To: mdf@FreeBSD.org Cc: svn-src-head@freebsd.org, Robert Watson <rwatson@FreeBSD.org>, svn-src-all@freebsd.org, src-committers@freebsd.org, Kostik Belousov <kib@FreeBSD.org> Subject: Re: svn commit: r227873 - head/usr.bin/procstat Message-ID: <86vcq6n8bu.fsf@kopusha.home.net> In-Reply-To: <86ipmaq9i4.fsf@in138.ua3> (Mikolaj Golub's message of "Thu, 24 Nov 2011 09:12:35 %2B0200") References: <201111230734.pAN7YA78032998@svn.freebsd.org> <CAMBSHm9=kToWP8kmc5YqfMeAC%2BeX_677MPsVK5cqrNaHekSctA@mail.gmail.com> <86ipmaq9i4.fsf@in138.ua3>
index | next in thread | previous in thread | raw e-mail
[-- Attachment #1 --]
On Thu, 24 Nov 2011 09:12:35 +0200 Mikolaj Golub wrote:
MG> On Wed, 23 Nov 2011 11:10:47 -0800 mdf@FreeBSD.org wrote:
>>> printf(" AT_IGNORE=0x%lu",
>>> - (unsigned long)aux->a_un.a_val);
>>> + (unsigned long)auxv[i].a_un.a_val);
m>> I didn't see this before, but this gives very misleading output. The
m>> 0x prefix implies the output will be hex, but it's printed as decimal,
m>> here and below.
MG> Oh. Thanks! Will fix.
m>> I don't know if there's a style preference for 0x%lx versus %#lx,
m>> though, or a preference for a different type for the print (uintmax_t,
m>> for example). There is probably a preference for using u_long rather
m>> than unsigned long, since it's shorter.
MG> It looks like both 0x%lx and %#lx are widely spread in our source, I like %#lx
MG> a little more. It looks for me that (u_long) will be ok for now, so the chage
MG> for the printf above would be:
MG> printf(" AT_IGNORE=%#lx", (u_long)auxv[i].a_un.a_val);
MG> Anyway, printing all values in the same format was considered by me as a
MG> temporary solution. I am going to have format depending on a_type, so e.g.
MG> AT_PAGESZ will be 4096, not 0x1000.
MG> Also, now they are printed as one string for a process:
MG> PID COMM AUXV
MG> 2520 firefox-bin AT_PHDR=0x400040 AT_PHENT=0x38 AT_PHNUM=0x7 AT_PAGESZ=0x1000 ...
MG> I am considering changing this too, to something like below:
MG> PID COMM AUXV VALUE
MG> 2520 firefox-bin AT_PHDR 0x400040
MG> 2520 firefox-bin AT_PHENT 56
MG> 2520 firefox-bin AT_PHNUM 7
MG> ...
I am going to commit this patch if nobody has any other suggestions.
The typical output:
in138:~% procstat -x 2008
PID COMM AUXV VALUE
2008 nginx AT_PHDR 0x400040
2008 nginx AT_PHENT 56
2008 nginx AT_PHNUM 8
2008 nginx AT_PAGESZ 4096
2008 nginx AT_FLAGS 0
2008 nginx AT_ENTRY 0x40de00
2008 nginx AT_BASE 0x800689000
2008 nginx AT_EXECPATH 0x7fffffffefca
2008 nginx AT_OSRELDATE 1000001
2008 nginx AT_CANARY 0x7fffffffef8a
2008 nginx AT_CANARYLEN 64
2008 nginx AT_NCPUS 2
2008 nginx AT_PAGESIZES 0x7fffffffef72
2008 nginx AT_PAGESIZESLEN 24
2008 nginx AT_STACKPROT VM_PROT_ALL
--
Mikolaj Golub
[-- Attachment #2 --]
Index: usr.bin/procstat/procstat_auxv.c
===================================================================
--- usr.bin/procstat/procstat_auxv.c (revision 227989)
+++ usr.bin/procstat/procstat_auxv.c (working copy)
@@ -27,9 +27,12 @@
*/
#include <sys/param.h>
+#include <sys/elf.h>
#include <sys/sysctl.h>
#include <sys/user.h>
+#include <vm/vm.h>
+
#include <err.h>
#include <errno.h>
#include <libprocstat.h>
@@ -38,12 +41,79 @@
#include <stdlib.h>
#include <string.h>
-#include <machine/elf.h>
-
#include "procstat.h"
static Elf_Auxinfo auxv[256];
+static char prefix[256];
+#define PRINT(name, spec, val) \
+ printf("%s %-16s " #spec "\n", prefix, #name, (val))
+#define PRINT_UNKNOWN(type, val) \
+ printf("%s %16ld %#lx\n", prefix, (long)type, (u_long)(val))
+
+static const char*
+stack_protection(u_long protection)
+{
+ size_t size;
+ int n;
+ char *p;
+ const char *delimiter;
+ static char buf[256];
+
+ buf[0] = '\0';
+
+ if (protection == VM_PROT_NONE) {
+ snprintf(buf, sizeof(buf), "%s", "VM_PROT_NONE");
+ } else if (protection == VM_PROT_ALL) {
+ snprintf(buf, sizeof(buf), "%s", "VM_PROT_ALL");
+ } else if (protection == VM_PROT_RW) {
+ snprintf(buf, sizeof(buf), "%s", "VM_PROT_RW");
+ } else {
+ size = sizeof(buf);
+ p = buf;
+ delimiter = "";
+
+ if (size > 0 && (protection & VM_PROT_READ) != 0) {
+ n = snprintf(p, size, "%s%s", delimiter,
+ "VM_PROT_READ");
+ protection &= ~VM_PROT_READ;
+ delimiter = " | ";
+ p += n;
+ size -= n;
+ }
+ if (size > 0 && (protection & VM_PROT_WRITE) != 0) {
+ n = snprintf(p, size, "%s%s", delimiter,
+ "VM_PROT_WRITE");
+ protection &= ~VM_PROT_WRITE;
+ delimiter = " | ";
+ p += n;
+ size -= n;
+ }
+ if (size > 0 && (protection & VM_PROT_EXECUTE) != 0) {
+ n = snprintf(p, size, "%s%s", delimiter,
+ "VM_PROT_EXECUTE");
+ protection &= ~VM_PROT_EXECUTE;
+ delimiter = " | ";
+ p += n;
+ size -= n;
+ }
+ if (size > 0 && (protection & VM_PROT_COPY) != 0) {
+ n = snprintf(p, size, "%s%s", delimiter,
+ "VM_PROT_COPY");
+ protection &= ~VM_PROT_COPY;
+ delimiter = " | ";
+ p += n;
+ size -= n;
+ }
+ if (size > 0 && protection != VM_PROT_NONE) {
+ n = snprintf(p, size, "%s%#lx", delimiter,
+ protection);
+ }
+ }
+
+ return buf;
+}
+
void
procstat_auxv(struct kinfo_proc *kipp)
{
@@ -51,7 +121,7 @@
size_t len, i;
if (!hflag)
- printf("%5s %-16s %-53s\n", "PID", "COMM", "AUXV");
+ printf("%5s %-16s %-16s %-16s\n", "PID", "COMM", "AUXV", "VALUE");
name[0] = CTL_KERN;
name[1] = KERN_PROC;
@@ -63,124 +133,99 @@
warn("sysctl: kern.proc.auxv: %d: %d", kipp->ki_pid, errno);
return;
}
- if (error < 0)
+ if (error < 0 || len == 0)
return;
- printf("%5d ", kipp->ki_pid);
- printf("%-16s", kipp->ki_comm);
if (len == 0) {
printf(" -\n");
return;
}
+ snprintf(prefix, sizeof(prefix), "%5d %-16s", kipp->ki_pid,
+ kipp->ki_comm);
for (i = 0; i < len; i++) {
switch(auxv[i].a_type) {
case AT_NULL:
- printf(" (%zu)\n", i + 1);
return;
case AT_IGNORE:
- printf(" AT_IGNORE=0x%lu",
- (unsigned long)auxv[i].a_un.a_val);
break;
case AT_EXECFD:
- printf(" AT_EXECFD=0x%lu",
- (unsigned long)auxv[i].a_un.a_val);
+ PRINT(AT_EXECFD, %ld, auxv[i].a_un.a_val);
break;
case AT_PHDR:
- printf(" AT_PHDR=0x%lu",
- (unsigned long)auxv[i].a_un.a_val);
+ PRINT(AT_PHDR, %p, auxv[i].a_un.a_ptr);
break;
case AT_PHENT:
- printf(" AT_PHENT=0x%lu",
- (unsigned long)auxv[i].a_un.a_val);
+ PRINT(AT_PHENT, %ld, auxv[i].a_un.a_val);
break;
case AT_PHNUM:
- printf(" AT_PHNUM=0x%lu",
- (unsigned long)auxv[i].a_un.a_val);
+ PRINT(AT_PHNUM, %ld, auxv[i].a_un.a_val);
break;
case AT_PAGESZ:
- printf(" AT_PAGESZ=0x%lu",
- (unsigned long)auxv[i].a_un.a_val);
+ PRINT(AT_PAGESZ, %ld, auxv[i].a_un.a_val);
break;
case AT_BASE:
- printf(" AT_BASE=0x%lu",
- (unsigned long)auxv[i].a_un.a_val);
+ PRINT(AT_BASE, %p, auxv[i].a_un.a_ptr);
break;
case AT_FLAGS:
- printf(" AT_FLAGS=0x%lu",
- (unsigned long)auxv[i].a_un.a_val);
+ PRINT(AT_FLAGS, %#lx, (u_long)auxv[i].a_un.a_val);
break;
case AT_ENTRY:
- printf(" AT_ENTRY=0x%lu",
- (unsigned long)auxv[i].a_un.a_val);
+ PRINT(AT_ENTRY, %p, auxv[i].a_un.a_ptr);
break;
#ifdef AT_NOTELF
case AT_NOTELF:
- printf(" AT_NOTELF=0x%lu",
- (unsigned long)auxv[i].a_un.a_val);
+ PRINT(AT_NOTELF, %ld, auxv[i].a_un.a_val);
break;
#endif
#ifdef AT_UID
case AT_UID:
- printf(" AT_UID=0x%lu",
- (unsigned long)auxv[i].a_un.a_val);
+ PRINT(AT_UID, %ld, auxv[i].a_un.a_val);
break;
#endif
#ifdef AT_EUID
case AT_EUID:
- printf(" AT_EUID=0x%lu",
- (unsigned long)auxv[i].a_un.a_val);
+ PRINT(AT_EUID, %ld, auxv[i].a_un.a_val);
break;
#endif
#ifdef AT_GID
case AT_GID:
- printf(" AT_GID=0x%lu",
- (unsigned long)auxv[i].a_un.a_val);
+ PRINT(AT_GID, %ld, auxv[i].a_un.a_val);
break;
#endif
#ifdef AT_EGID
case AT_EGID:
- printf(" AT_EGID=0x%lu",
- (unsigned long)auxv[i].a_un.a_val);
+ PRINT(AT_EGID, %ld, auxv[i].a_un.a_val);
break;
#endif
case AT_EXECPATH:
- printf(" AT_EXECPATH=0x%lu",
- (unsigned long)auxv[i].a_un.a_val);
+ PRINT(AT_EXECPATH, %p, auxv[i].a_un.a_ptr);
break;
case AT_CANARY:
- printf(" AT_CANARY=0x%lu",
- (unsigned long)auxv[i].a_un.a_val);
+ PRINT(AT_CANARY, %p, auxv[i].a_un.a_ptr);
break;
case AT_CANARYLEN:
- printf(" AT_CANARYLEN=0x%lu",
- (unsigned long)auxv[i].a_un.a_val);
+ PRINT(AT_CANARYLEN, %ld, auxv[i].a_un.a_val);
break;
case AT_OSRELDATE:
- printf(" AT_OSRELDATE=0x%lu",
- (unsigned long)auxv[i].a_un.a_val);
+ PRINT(AT_OSRELDATE, %ld, auxv[i].a_un.a_val);
break;
case AT_NCPUS:
- printf(" AT_NCPUS=0x%lu",
- (unsigned long)auxv[i].a_un.a_val);
+ PRINT(AT_NCPUS, %ld, auxv[i].a_un.a_val);
break;
case AT_PAGESIZES:
- printf(" AT_PAGESIZES=0x%lu",
- (unsigned long)auxv[i].a_un.a_val);
+ PRINT(AT_PAGESIZES, %p, auxv[i].a_un.a_ptr);
break;
case AT_PAGESIZESLEN:
- printf(" AT_PAGESIZESLEN=0x%lu",
- (unsigned long)auxv[i].a_un.a_val);
+ PRINT(AT_PAGESIZESLEN, %ld, auxv[i].a_un.a_val);
break;
case AT_STACKPROT:
- printf(" AT_STACKPROT=0x%lu",
- (unsigned long)auxv[i].a_un.a_val);
+ PRINT(AT_STACKPROT, %s,
+ stack_protection(auxv[i].a_un.a_val));
break;
case AT_COUNT:
- printf(" AT_COUNT=0x%lu",
- (unsigned long)auxv[i].a_un.a_val);
+ PRINT(AT_COUNT, %ld, auxv[i].a_un.a_val);
break;
default:
- printf(" %ld=0x%lu", (long)auxv[i].a_type,
- (unsigned long)auxv[i].a_un.a_val);
+ PRINT_UNKNOWN(auxv[i].a_type, auxv[i].a_un.a_val);
break;
}
}
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?86vcq6n8bu.fsf>
