summaryrefslogtreecommitdiffstats
path: root/toolkit/crashreporter/google-breakpad/src/tools/python
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/crashreporter/google-breakpad/src/tools/python')
-rw-r--r--toolkit/crashreporter/google-breakpad/src/tools/python/filter_syms.py204
-rw-r--r--toolkit/crashreporter/google-breakpad/src/tools/python/tests/filter_syms_unittest.py138
2 files changed, 0 insertions, 342 deletions
diff --git a/toolkit/crashreporter/google-breakpad/src/tools/python/filter_syms.py b/toolkit/crashreporter/google-breakpad/src/tools/python/filter_syms.py
deleted file mode 100644
index abddf7893..000000000
--- a/toolkit/crashreporter/google-breakpad/src/tools/python/filter_syms.py
+++ /dev/null
@@ -1,204 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2012 Google Inc.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-# * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-# * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-"""Normalizes and de-duplicates paths within Breakpad symbol files.
-
-When using DWARF for storing debug symbols, some file information will be
-stored relative to the current working directory of the current compilation
-unit, and may be further relativized based upon how the file was #included.
-
-This helper can be used to parse the Breakpad symbol file generated from such
-DWARF files and normalize and de-duplicate the FILE records found within,
-updating any references to the FILE records in the other record types.
-"""
-
-import macpath
-import ntpath
-import optparse
-import os
-import posixpath
-import sys
-
-class BreakpadParseError(Exception):
- """Unsupported Breakpad symbol record exception class."""
- pass
-
-class SymbolFileParser(object):
- """Parser for Breakpad symbol files.
-
- The format of these files is documented at
- https://chromium.googlesource.com/breakpad/breakpad/+/master/docs/symbol_files.md
- """
-
- def __init__(self, input_stream, output_stream, ignored_prefixes=None,
- path_handler=os.path):
- """Inits a SymbolFileParser to read symbol records from |input_stream| and
- write the processed output to |output_stream|.
-
- |ignored_prefixes| contains a list of optional path prefixes that
- should be stripped from the final, normalized path outputs.
-
- For example, if the Breakpad symbol file had all paths starting with a
- common prefix, such as:
- FILE 1 /b/build/src/foo.cc
- FILE 2 /b/build/src/bar.cc
- Then adding "/b/build/src" as an ignored prefix would result in an output
- file that contained:
- FILE 1 foo.cc
- FILE 2 bar.cc
-
- Note that |ignored_prefixes| does not necessarily contain file system
- paths, as the contents of the DWARF DW_AT_comp_dir attribute is dependent
- upon the host system and compiler, and may contain additional information
- such as hostname or compiler version.
- """
-
- self.unique_files = {}
- self.duplicate_files = {}
- self.input_stream = input_stream
- self.output_stream = output_stream
- self.ignored_prefixes = ignored_prefixes or []
- self.path_handler = path_handler
-
- def Process(self):
- """Processes the Breakpad symbol file."""
- for line in self.input_stream:
- parsed = self._ParseRecord(line.rstrip())
- if parsed:
- self.output_stream.write(parsed + '\n')
-
- def _ParseRecord(self, record):
- """Parses a single Breakpad symbol record - a single line from the symbol
- file.
-
- Returns:
- The modified string to write to the output file, or None if no line
- should be written.
- """
- record_type = record.partition(' ')[0]
- if record_type == 'FILE':
- return self._ParseFileRecord(record)
- elif self._IsLineRecord(record_type):
- return self._ParseLineRecord(record)
- else:
- # Simply pass the record through unaltered.
- return record
-
- def _NormalizePath(self, path):
- """Normalizes a file path to its canonical form.
-
- As this may not execute on the machine or file system originally
- responsible for compilation, it may be necessary to further correct paths
- for symlinks, junctions, or other such file system indirections.
-
- Returns:
- A unique, canonical representation for the the file path.
- """
- return self.path_handler.normpath(path)
-
- def _AdjustPath(self, path):
- """Adjusts the supplied path after performing path de-duplication.
-
- This may be used to perform secondary adjustments, such as removing a
- common prefix, such as "/D/build", or replacing the file system path with
- information from the version control system.
-
- Returns:
- The actual path to use when writing the FILE record.
- """
- return path[len(filter(path.startswith,
- self.ignored_prefixes + [''])[0]):]
-
- def _ParseFileRecord(self, file_record):
- """Parses and corrects a FILE record."""
- file_info = file_record[5:].split(' ', 3)
- if len(file_info) > 2:
- raise BreakpadParseError('Unsupported FILE record: ' + file_record)
- file_index = int(file_info[0])
- file_name = self._NormalizePath(file_info[1])
- existing_file_index = self.unique_files.get(file_name)
- if existing_file_index is None:
- self.unique_files[file_name] = file_index
- file_info[1] = self._AdjustPath(file_name)
- return 'FILE ' + ' '.join(file_info)
- else:
- self.duplicate_files[file_index] = existing_file_index
- return None
-
- def _IsLineRecord(self, record_type):
- """Determines if the current record type is a Line record"""
- try:
- line = int(record_type, 16)
- except (ValueError, TypeError):
- return False
- return True
-
- def _ParseLineRecord(self, line_record):
- """Parses and corrects a Line record."""
- line_info = line_record.split(' ', 5)
- if len(line_info) > 4:
- raise BreakpadParseError('Unsupported Line record: ' + line_record)
- file_index = int(line_info[3])
- line_info[3] = str(self.duplicate_files.get(file_index, file_index))
- return ' '.join(line_info)
-
-def main():
- option_parser = optparse.OptionParser()
- option_parser.add_option("-p", "--prefix",
- action="append", dest="prefixes", type="string",
- default=[],
- help="A path prefix that should be removed from "
- "all FILE lines. May be repeated to specify "
- "multiple prefixes.")
- option_parser.add_option("-t", "--path_type",
- action="store", type="choice", dest="path_handler",
- choices=['win32', 'posix'],
- help="Indicates how file paths should be "
- "interpreted. The default is to treat paths "
- "the same as the OS running Python (eg: "
- "os.path)")
- options, args = option_parser.parse_args()
- if args:
- option_parser.error('Unknown argument: %s' % args)
-
- path_handler = { 'win32': ntpath,
- 'posix': posixpath }.get(options.path_handler, os.path)
- try:
- symbol_parser = SymbolFileParser(sys.stdin, sys.stdout, options.prefixes,
- path_handler)
- symbol_parser.Process()
- except BreakpadParseError, e:
- print >> sys.stderr, 'Got an error while processing symbol file'
- print >> sys.stderr, str(e)
- return 1
- return 0
-
-if __name__ == '__main__':
- sys.exit(main())
diff --git a/toolkit/crashreporter/google-breakpad/src/tools/python/tests/filter_syms_unittest.py b/toolkit/crashreporter/google-breakpad/src/tools/python/tests/filter_syms_unittest.py
deleted file mode 100644
index b111f3498..000000000
--- a/toolkit/crashreporter/google-breakpad/src/tools/python/tests/filter_syms_unittest.py
+++ /dev/null
@@ -1,138 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2012 Google Inc.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-# * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-# * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-"""Unit tests for filter_syms.py"""
-
-import cStringIO
-import ntpath
-import os
-import StringIO
-import sys
-import unittest
-
-ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
-sys.path.insert(0, os.path.join(ROOT_DIR, '..'))
-
-# In root
-import filter_syms
-
-class FilterSysmsTest(unittest.TestCase):
- def assertParsed(self, input_data, ignored_prefixes, expected):
- input_io = cStringIO.StringIO(input_data)
- output_io = cStringIO.StringIO()
- parser = filter_syms.SymbolFileParser(input_io, output_io,
- ignored_prefixes, ntpath)
- parser.Process()
- self.assertEqual(output_io.getvalue(), expected)
-
- def testDuplicateFiles(self):
- """Tests that duplicate files in FILE records are correctly removed and
- that Line records are updated."""
-
- INPUT = \
-"""MODULE windows x86 111111111111111111111111111111111 module1.pdb
-INFO CODE_ID FFFFFFFF module1.exe
-FILE 1 foo/../file1_1.cc
-FILE 2 bar/../file1_1.cc
-FILE 3 baz/../file1_1.cc
-FUNC 1000 c 0 Function1_1
-1000 8 45 2
-1008 4 46 3
-100c 4 44 1
-"""
- EXPECTED_OUTPUT = \
-"""MODULE windows x86 111111111111111111111111111111111 module1.pdb
-INFO CODE_ID FFFFFFFF module1.exe
-FILE 1 file1_1.cc
-FUNC 1000 c 0 Function1_1
-1000 8 45 1
-1008 4 46 1
-100c 4 44 1
-"""
- self.assertParsed(INPUT, [], EXPECTED_OUTPUT)
-
- def testIgnoredPrefix(self):
- """Tests that prefixes in FILE records are correctly removed."""
-
- INPUT = \
-"""MODULE windows x86 111111111111111111111111111111111 module1.pdb
-INFO CODE_ID FFFFFFFF module1.exe
-FILE 1 /src/build/foo/../file1_1.cc
-FILE 2 /src/build/bar/../file1_2.cc
-FILE 3 /src/build/baz/../file1_2.cc
-FUNC 1000 c 0 Function1_1
-1000 8 45 2
-1008 4 46 3
-100c 4 44 1
-"""
- EXPECTED_OUTPUT = \
-"""MODULE windows x86 111111111111111111111111111111111 module1.pdb
-INFO CODE_ID FFFFFFFF module1.exe
-FILE 1 file1_1.cc
-FILE 2 file1_2.cc
-FUNC 1000 c 0 Function1_1
-1000 8 45 2
-1008 4 46 2
-100c 4 44 1
-"""
- IGNORED_PREFIXES = ['\\src\\build\\']
- self.assertParsed(INPUT, IGNORED_PREFIXES, EXPECTED_OUTPUT)
-
- def testIgnoredPrefixesDuplicateFiles(self):
- """Tests that de-duplication of FILE records happens BEFORE prefixes
- are removed."""
-
- INPUT = \
-"""MODULE windows x86 111111111111111111111111111111111 module1.pdb
-INFO CODE_ID FFFFFFFF module1.exe
-FILE 1 /src/build/foo/../file1_1.cc
-FILE 2 /src/build/bar/../file1_2.cc
-FILE 3 D:/src/build2/baz/../file1_2.cc
-FUNC 1000 c 0 Function1_1
-1000 8 45 2
-1008 4 46 3
-100c 4 44 1
-"""
- EXPECTED_OUTPUT = \
-"""MODULE windows x86 111111111111111111111111111111111 module1.pdb
-INFO CODE_ID FFFFFFFF module1.exe
-FILE 1 file1_1.cc
-FILE 2 file1_2.cc
-FILE 3 file1_2.cc
-FUNC 1000 c 0 Function1_1
-1000 8 45 2
-1008 4 46 3
-100c 4 44 1
-"""
- IGNORED_PREFIXES = ['\\src\\build\\', 'D:\\src\\build2\\']
- self.assertParsed(INPUT, IGNORED_PREFIXES, EXPECTED_OUTPUT)
-
-if __name__ == '__main__':
- unittest.main() \ No newline at end of file