On Thu, 24 Nov 2011 09:12:35 +0200 Mikolaj Golub wrote: MG> On Wed, 23 Nov 2011 11:10:47 -0800 m...@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
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; } }
_______________________________________________ svn-src-head@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-head To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"