1e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <stdio.h>
2e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <stdlib.h>
3e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <math.h>
4e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <string.h>
5e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <errno.h>
6e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <unistd.h>
7e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <fcntl.h>
8e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
9e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <ctype.h>
10e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <stddef.h>
11e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
12e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projecttypedef struct mapinfo mapinfo;
13e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
14e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstruct mapinfo {
15e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    mapinfo *next;
16e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    unsigned start;
17e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    unsigned end;
18e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    unsigned size;
19e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    unsigned rss;
20e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    unsigned pss;
21e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    unsigned shared_clean;
22e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    unsigned shared_dirty;
23e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    unsigned private_clean;
24e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    unsigned private_dirty;
25e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    char name[1];
26e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project};
27e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
28e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project// 6f000000-6f01e000 rwxp 00000000 00:0c 16389419   /android/lib/libcomposer.so
29e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project// 012345678901234567890123456789012345678901234567890123456789
30e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project// 0         1         2         3         4         5
31e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
32e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectmapinfo *read_mapinfo(FILE *fp)
33e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
34e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    char line[1024];
35e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    mapinfo *mi;
36e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    int len;
37e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    int skip;
38e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
39e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectagain:
40e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    skip = 0;
41e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
42e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(fgets(line, 1024, fp) == 0) return 0;
43e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
44e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    len = strlen(line);
45e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(len < 1) return 0;
46e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    line[--len] = 0;
47e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
48e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    mi = calloc(1, sizeof(mapinfo) + len + 16);
49e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(mi == 0) return 0;
50e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
51e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    mi->start = strtoul(line, 0, 16);
52e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    mi->end = strtoul(line + 9, 0, 16);
53e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
54e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(len < 50) {
55e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        if((mi->start >= 0x10000000) && (mi->start < 0x40000000)) {
56e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            strcpy(mi->name, "[stack]");
57e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        } else if(mi->start > 0x50000000) {
58e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            strcpy(mi->name, "[lib_bss]");
59e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        } else {
60e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            strcpy(mi->name, "[anon]");
61e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        }
62e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    } else {
63e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        strcpy(mi->name, line + 49);
64e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
65e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
66e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(fgets(line, 1024, fp) == 0) goto oops;
67e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(sscanf(line, "Size: %d kB", &mi->size) != 1) goto oops;
68e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(fgets(line, 1024, fp) == 0) goto oops;
69e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(sscanf(line, "Rss: %d kB", &mi->rss) != 1) goto oops;
70e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(fgets(line, 1024, fp) == 0) goto oops;
71e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(sscanf(line, "Pss: %d kB", &mi->pss) == 1)
72e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        if(fgets(line, 1024, fp) == 0) goto oops;
73e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(sscanf(line, "Shared_Clean: %d kB", &mi->shared_clean) != 1) goto oops;
74e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(fgets(line, 1024, fp) == 0) goto oops;
75e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(sscanf(line, "Shared_Dirty: %d kB", &mi->shared_dirty) != 1) goto oops;
76e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(fgets(line, 1024, fp) == 0) goto oops;
77e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(sscanf(line, "Private_Clean: %d kB", &mi->private_clean) != 1) goto oops;
78e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(fgets(line, 1024, fp) == 0) goto oops;
79e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(sscanf(line, "Private_Dirty: %d kB", &mi->private_dirty) != 1) goto oops;
8089f9b9118a393ca5ca16467ec9e5e3e4a84690b5San Mehat
8189f9b9118a393ca5ca16467ec9e5e3e4a84690b5San Mehat    if(fgets(line, 1024, fp) == 0) goto oops; // Referenced
8289f9b9118a393ca5ca16467ec9e5e3e4a84690b5San Mehat    if(fgets(line, 1024, fp) == 0) goto oops; // Swap
8389f9b9118a393ca5ca16467ec9e5e3e4a84690b5San Mehat    if(fgets(line, 1024, fp) == 0) goto oops; // KernelPageSize
8489f9b9118a393ca5ca16467ec9e5e3e4a84690b5San Mehat    if(fgets(line, 1024, fp) == 0) goto oops; // MMUPageSize
85e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
86e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(skip) {
87e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        free(mi);
88e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        goto again;
89e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
90e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
91e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    return mi;
92e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectoops:
93e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fprintf(stderr, "WARNING: Format of /proc/<pid>/smaps has changed!\n");
94e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    free(mi);
95e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    return 0;
96e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
97e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
98e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
99e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectmapinfo *load_maps(int pid, int verbose)
100e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
101e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    char tmp[128];
102e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    FILE *fp;
103e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    mapinfo *milist = 0;
104e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    mapinfo *mi;
105e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
106e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    sprintf(tmp, "/proc/%d/smaps", pid);
107e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fp = fopen(tmp, "r");
108e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(fp == 0) return 0;
109e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
110e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    while((mi = read_mapinfo(fp)) != 0) {
111e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            /* if not verbose, coalesce mappings from the same entity */
112e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        if(!verbose && milist) {
113e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            if((!strcmp(mi->name, milist->name) && (mi->name[0] != '['))
114e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project               || !strcmp(mi->name,"[lib_bss]")) {
115e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                milist->size += mi->size;
116e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                milist->rss += mi->rss;
117e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                milist->pss += mi->pss;
118e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                milist->shared_clean += mi->shared_clean;
119e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                milist->shared_dirty += mi->shared_dirty;
120e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                milist->private_clean += mi->private_clean;
121e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                milist->private_dirty += mi->private_dirty;
122e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                milist->end = mi->end;
123e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                free(mi);
124e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                continue;
125e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            }
126e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        }
127e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
128e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        mi->next = milist;
129e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        milist = mi;
130e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
131e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fclose(fp);
132e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
133e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    return milist;
134e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
135e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
136e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic int verbose = 0;
137e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic int terse = 0;
138e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic int addresses = 0;
139e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
140e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint show_map(int pid)
141e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
142e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    mapinfo *milist;
143e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    mapinfo *mi;
144e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    unsigned shared_dirty = 0;
145e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    unsigned shared_clean = 0;
146e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    unsigned private_dirty = 0;
147e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    unsigned private_clean = 0;
148e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    unsigned rss = 0;
149e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    unsigned pss = 0;
150e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    unsigned size = 0;
151e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
152e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    milist = load_maps(pid, verbose);
153e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(milist == 0) {
154e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        fprintf(stderr,"cannot get /proc/smaps for pid %d\n", pid);
155e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        return 1;
156e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
157e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
158e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(addresses) {
159e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        printf("start    end      shared   private  object\n");
160e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        printf("-------- -------- -------- -------- ------------------------------\n");
161e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    } else {
162e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        printf("virtual                    shared   shared   private  private\n");
163e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        printf("size     RSS      PSS      clean    dirty    clean    dirty    object\n");
164e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        printf("-------- -------- -------- -------- -------- -------- -------- ------------------------------\n");
165e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
166e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    for(mi = milist; mi; mi = mi->next){
167e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        shared_clean += mi->shared_clean;
168e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        shared_dirty += mi->shared_dirty;
169e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        private_clean += mi->private_clean;
170e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        private_dirty += mi->private_dirty;
171e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        rss += mi->rss;
172e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        pss += mi->pss;
173e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        size += mi->size;
174e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
175e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        if(terse && !mi->private_dirty) continue;
176e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
177e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        if(addresses) {
178e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            printf("%08x %08x %8d %8d %s\n", mi->start, mi->end,
179e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                   mi->shared_clean + mi->shared_dirty,
180e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                   mi->private_clean + mi->private_dirty,
181e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                   mi->name);
182e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        } else {
183e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            printf("%8d %8d %8d %8d %8d %8d %8d %s\n", mi->size,
184e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                   mi->rss,
185e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                   mi->pss,
186e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                   mi->shared_clean, mi->shared_dirty,
187e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                   mi->private_clean, mi->private_dirty,
188e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                   mi->name);
189e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        }
190e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
191e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(addresses) {
192e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        printf("-------- -------- -------- -------- ------------------------------\n");
193e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        printf("                  %8d %8d TOTAL\n",
194e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project               shared_dirty + shared_clean,
195e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project               private_dirty + private_clean);
196e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    } else {
197e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        printf("-------- -------- -------- -------- -------- -------- -------- ------------------------------\n");
198e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        printf("%8d %8d %8d %8d %8d %8d %8d TOTAL\n", size,
199e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project               rss, pss,
200e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project               shared_clean, shared_dirty,
201e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project               private_clean, private_dirty);
202e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
203e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    return 0;
204e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
205e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
206e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint main(int argc, char *argv[])
207e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
208e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    int usage = 1;
209e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
210e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    for(argc--, argv++; argc > 0; argc--, argv++) {
211e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        if(!strcmp(argv[0],"-v")) {
212e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            verbose = 1;
213e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            continue;
214e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        }
215e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        if(!strcmp(argv[0],"-t")) {
216e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            terse = 1;
217e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            continue;
218e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        }
219e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        if(!strcmp(argv[0],"-a")) {
220e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            addresses = 1;
221e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            continue;
222e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        }
223e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        show_map(atoi(argv[0]));
224e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        usage = 0;
225e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
226e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
227e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(usage) {
228e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        fprintf(stderr,
229e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                "showmap [-t] [-v] [-c] <pid>\n"
230e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                "        -t = terse (show only items with private pages)\n"
231e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                "        -v = verbose (don't coalesce adjacant maps)\n"
232e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                "        -a = addresses (show virtual memory map)\n"
233e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                );
234e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
235e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
236e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project	return 0;
237e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
238