[PATCH] pmap: new applet

Denys Vlasenko vda.linux at googlemail.com
Tue Aug 24 07:47:52 UTC 2010


On Tuesday 17 August 2010 12:05, Alexander Shishkin wrote:
> On Sun, Jul 31, 2010 at 01:23:54 +0300, Alexander Shishkin wrote:
> > pmap is a tool used to look at processes' memory maps, normally found
> > in procps package. It provides more readable and easily sortable output
> > (one line per mapping) from  maps/smaps files in /proc/PID/.  This would
> > help in debugging memory usage issues, especially on devices where lots
> > of typing is not a viable option.
> 
> Ping.

+struct smaprec {
+       unsigned long mapped_rw;
+       unsigned long mapped_ro;
+       unsigned long shared_clean;
+       unsigned long shared_dirty;
+       unsigned long private_clean;
+       unsigned long private_dirty;
+       unsigned long stack;
+       unsigned long pss, swap;
+       unsigned long size;
+       unsigned long start;
+       char mode[5];
+       char *name;
+};

Can you prefix new field names with smap_ ?
Grepping fails for field named simply "name" - too many
such names already.


                while (*str++ != ' ')
-                       continue;
-               /* we found a space char, str points after it */
+                       ;

Why this change?


+#ifdef ENABLE_FEATURE_TOPMEM

This should be #if, not #ifdef. Also, you need to add "|| ENABLE_PMAP"


+       RESERVE_CONFIG_BUFFER(filename, FILENAME_MAX);
+       RESERVE_CONFIG_BUFFER(buf, PROCPS_BUFSIZE);
+
+       snprintf(filename, FILENAME_MAX, "/proc/%d/smaps", pid);

It's better to use smaller buffer for filename.


+#define SCAN(X) \
+               if (strncasecmp(tp, #X ":", sizeof #X) == 0) {       \
+                       tp = skip_whitespace(tp + sizeof(#X));       \
+                       total->X += currec.X = fast_strtoul_10(&tp); \
+                       continue;                                    \
+               }
+
+               SCAN(pss);
+               SCAN(swap);

strncasecmp is slower than strncmp. You trade a small convenience
in calling the macro for accumulated slowness in top for _every_
_line_ of smaps!


+                       if (p == tp)
+                               currec.name = xstrdup("  [ anon ]");
+                       else {
+                               *p = '\0';
+                               currec.name = xstrdup(tp);
+                       }

This allocating/freeing of name field will slow down top,
without any reason to do so.


+       opt = getopt32(argv, "xq");
+
+       for (argv += optind; argv && *argv; argv++) {

argv is never NULL, no need to check for that.


+       RESERVE_CONFIG_BUFFER(buf, BUFSIZ);
a
+       read_cmdline(buf, BUFSIZ, pid, "no such process");
+       printf("%d:   %s\n", pid, buf);

standard pmap does not show the whole command line, only process name.
The output format is different too.


+       if (!(opt & OPT_Q) && (opt & OPT_X))
+               printf("--------" DASHES "  ------  ------  ------  ------\n"
+                      "total" TABS " %7lu %7lu %7lu %7lu\n",
+                      total.size, total.pss, total.private_dirty, total.swap);
+       else if (!(opt & OPT_Q))
+               printf(" total" TABS "%7luK\n", total.size);

!(opt & OPT_Q) is tested twice.


And now, run testing. I ran top, pressed 's' and then pressed
and kept space down. Top leaks memory:

Mem total:2054936 anon:191364 map:50604 free:583520
 slab:118472 buf:133744 cache:1006420 dirty:20 write:0
Swap total:131068 free:131068
  PID   VSZ*VSZRW   RSS (SHR) DIRTY (SHR) STACK COMMAND
 3616  202m  165m 67904  2824 47876    64   132 /usr/app/firefox-3.6/firefox-bin
24722 45092 44236 44292     0 44116     0   132 ./busybox top      <=======================
 3075  104m 36972 56988 11944 38176     0  2368 kmail -caption KMail -icon kmail -miniicon kmail
 2053 17080 12368 14784  1460 11232     0   132 X :0
...

I'm not impressed.
Try attached.

-- 
vda
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 3.patch
Type: text/x-diff
Size: 10502 bytes
Desc: not available
URL: <http://lists.busybox.net/pipermail/busybox/attachments/20100824/a73b386e/attachment-0001.bin>


More information about the busybox mailing list