Home | History | Annotate | Download | only in deep_memory_profiler
      1 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 """The Deep Memory Profiler analyzer script.
      6 
      7 See http://dev.chromium.org/developers/deep-memory-profiler for details.
      8 """
      9 
     10 import logging
     11 import sys
     12 
     13 from lib.exceptions import ParsingException
     14 import subcommands
     15 
     16 
     17 LOGGER = logging.getLogger('dmprof')
     18 
     19 
     20 def main():
     21   COMMANDS = {
     22     'buckets': subcommands.BucketsCommand,
     23     'cat': subcommands.CatCommand,
     24     'csv': subcommands.CSVCommand,
     25     'expand': subcommands.ExpandCommand,
     26     'json': subcommands.JSONCommand,
     27     'list': subcommands.ListCommand,
     28     'map': subcommands.MapCommand,
     29     'pprof': subcommands.PProfCommand,
     30     'stacktrace': subcommands.StacktraceCommand,
     31     'upload': subcommands.UploadCommand,
     32   }
     33 
     34   if len(sys.argv) < 2 or (not sys.argv[1] in COMMANDS):
     35     sys.stderr.write("""Usage: dmprof <command> [options] [<args>]
     36 
     37 Commands:
     38    buckets      Dump a bucket list with resolving symbols
     39    cat          Categorize memory usage (under development)
     40    csv          Classify memory usage in CSV
     41    expand       Show all stacktraces contained in the specified component
     42    json         Classify memory usage in JSON
     43    list         Classify memory usage in simple listing format
     44    map          Show history of mapped regions
     45    pprof        Format the profile dump so that it can be processed by pprof
     46    stacktrace   Convert runtime addresses to symbol names
     47    upload       Upload dumped files
     48 
     49 Quick Reference:
     50    dmprof buckets <first-dump>
     51    dmprof cat <first-dump>
     52    dmprof csv [-p POLICY] <first-dump>
     53    dmprof expand <dump> <policy> <component> <depth>
     54    dmprof json [-p POLICY] <first-dump>
     55    dmprof list [-p POLICY] <first-dump>
     56    dmprof map <first-dump> <policy>
     57    dmprof pprof [-c COMPONENT] <dump> <policy>
     58    dmprof stacktrace <dump>
     59    dmprof upload [--gsutil path/to/gsutil] <first-dump> <destination-gs-path>
     60 """)
     61     sys.exit(1)
     62   action = sys.argv.pop(1)
     63 
     64   LOGGER.setLevel(logging.DEBUG)
     65   handler = logging.StreamHandler()
     66   handler.setLevel(logging.INFO)
     67   formatter = logging.Formatter('%(message)s')
     68   handler.setFormatter(formatter)
     69   LOGGER.addHandler(handler)
     70 
     71   try:
     72     errorcode = COMMANDS[action]().do(sys.argv)
     73   except ParsingException, e:
     74     errorcode = 1
     75     sys.stderr.write('Exit by parsing error: %s\n' % e)
     76 
     77   return errorcode
     78 
     79 
     80 if __name__ == '__main__':
     81   sys.exit(main())
     82