From owner-svn-src-all@FreeBSD.ORG Sat Nov 26 16:43:08 2011 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D15D7106564A; Sat, 26 Nov 2011 16:43:08 +0000 (UTC) (envelope-from to.my.trociny@gmail.com) Received: from mail-ey0-f182.google.com (mail-ey0-f182.google.com [209.85.215.182]) by mx1.freebsd.org (Postfix) with ESMTP id 711B18FC08; Sat, 26 Nov 2011 16:43:07 +0000 (UTC) Received: by eaai12 with SMTP id i12so1945044eaa.13 for ; Sat, 26 Nov 2011 08:43:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=from:to:cc:subject:references:x-comment-to:sender:date:in-reply-to :message-id:user-agent:mime-version:content-type; bh=RzVnOY46P+RXIzuSi5GjrAqvQUPzrxfpkec+XDjv6H4=; b=jj0TrUZzb7qs0HxSdoZrVU8qCjKAL5MNzxf3ga/hFIBiC4xEltPQT9RuVsCYJTcPn8 V3qFsUDowqK/UqS7mLHsIBVanbwayj6v4Uj51G0aSZq9nNtrnzF1RIlwfmMxXHI2xuEv V1V7V1kyTWcOZX3zH69NuPdz4EkAGnMWsMBF0= Received: by 10.213.21.2 with SMTP id h2mr230339ebb.81.1322325786352; Sat, 26 Nov 2011 08:43:06 -0800 (PST) Received: from localhost ([95.69.173.122]) by mx.google.com with ESMTPS id e6sm2640256fah.0.2011.11.26.08.43.03 (version=TLSv1/SSLv3 cipher=OTHER); Sat, 26 Nov 2011 08:43:04 -0800 (PST) From: Mikolaj Golub To: mdf@FreeBSD.org References: <201111230734.pAN7YA78032998@svn.freebsd.org> <86ipmaq9i4.fsf@in138.ua3> X-Comment-To: Mikolaj Golub Sender: Mikolaj Golub Date: Sat, 26 Nov 2011 18:43:01 +0200 In-Reply-To: <86ipmaq9i4.fsf@in138.ua3> (Mikolaj Golub's message of "Thu, 24 Nov 2011 09:12:35 +0200") Message-ID: <86vcq6n8bu.fsf@kopusha.home.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.2 (berkeley-unix) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Cc: svn-src-head@freebsd.org, Robert Watson , svn-src-all@freebsd.org, src-committers@freebsd.org, Kostik Belousov Subject: Re: svn commit: r227873 - head/usr.bin/procstat X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 26 Nov 2011 16:43:09 -0000 --=-=-= Content-Type: text/plain; charset=koi8-r Content-Transfer-Encoding: 8bit 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 --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=procstat_auxv.c.patch 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 +#include #include #include +#include + #include #include #include @@ -38,12 +41,79 @@ #include #include -#include - #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; } } --=-=-=--