17dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch# Copyright 2013 The Chromium Authors. All rights reserved.
27dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch# Use of this source code is governed by a BSD-style license that can be
37dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch# found in the LICENSE file.
47dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport sys
67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochfrom lib.bucket import BUCKET_ID
87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochfrom lib.subcommand import SubCommand
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass StacktraceCommand(SubCommand):
127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  def __init__(self):
137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    super(StacktraceCommand, self).__init__(
147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        'Usage: %prog stacktrace <dump>')
157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  def do(self, sys_argv):
177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    _, args = self._parse_args(sys_argv, 1)
187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    dump_path = args[1]
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    (bucket_set, dump) = SubCommand.load_basic_files(dump_path, False)
207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    StacktraceCommand._output(dump, bucket_set, sys.stdout)
227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return 0
237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  @staticmethod
257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  def _output(dump, bucket_set, out):
267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    """Outputs a given stacktrace.
277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    Args:
297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        bucket_set: A BucketSet object.
307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        out: A file object to output.
317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    """
327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    for line in dump.iter_stacktrace:
337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      words = line.split()
347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      bucket = bucket_set.get(int(words[BUCKET_ID]))
357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      if not bucket:
367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        continue
377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      for i in range(0, BUCKET_ID - 1):
387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        out.write(words[i] + ' ')
397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      for frame in bucket.symbolized_stackfunction:
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        out.write(frame + ' ')
417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      out.write('\n')
42