Пример #1
0
 def testCompleteFail(self):
     """Running dump_syms always fails"""
     self.rc_mock.SetDefaultCmdResult(returncode=1)
     ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbol(
         self.elf_file)
     self.assertEqual(ret, 1)
     # Make sure the num_errors flag works too.
     num_errors = ctypes.c_int()
     ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbol(
         self.elf_file, num_errors=num_errors)
     self.assertEqual(ret, 1)
     self.assertEqual(num_errors.value, 1)
Пример #2
0
def _UnpackGenerateBreakpad(elf_file, *args, **kwargs):
    """Unpack Android relocation symbols, and GenerateBreakpadSymbol

  This method accepts exactly the same arguments as
  cros_generate_breakpad_symbols.GenerateBreakpadSymbol, except that it requires
  elf_file, and fills in dump_sym_cmd.

  Args:
    elf_file: Name of the file to generate breakpad symbols for.
    args: See cros_generate_breakpad_symbols.GenerateBreakpadSymbol.
    kwargs: See cros_generate_breakpad_symbols.GenerateBreakpadSymbol.
  """
    # We try to unpack, and just see if it works. Real failures caused by
    # something other than a binary that's already unpacked will be logged and
    # ignored. We'll notice them when dump_syms fails later (which it will on
    # packed binaries.).
    unpack_cmd = [RELOCATION_PACKER_BIN, '-u', elf_file]
    unpack_result = cros_build_lib.run(unpack_cmd,
                                       stdout=True,
                                       check=False,
                                       encoding='utf8')

    # If we unpacked, extract the offset, and remember it.
    offset = FindExpansionOffset(unpack_result)

    if offset:
        logging.info('Unpacked relocation symbols for %s with offset %d.',
                     elf_file, offset)

    # Now generate breakpad symbols from the binary.
    breakpad_file = cros_generate_breakpad_symbols.GenerateBreakpadSymbol(
        elf_file, *args, **kwargs)

    if offset:
        _AdjustSymbolOffset(breakpad_file, offset)
Пример #3
0
 def testNormalElfOnly(self):
     """Normal run -- given just an ELF"""
     ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbol(
         self.elf_file, breakpad_dir=self.breakpad_dir)
     self.assertEqual(ret, self.sym_file)
     self.assertCommandArgs(0, ['dump_syms', '-v', self.elf_file])
     self.assertEqual(self.rc.call_count, 1)
     self.assertExists(self.sym_file)
Пример #4
0
 def testNormalBoard(self):
     """Normal run w/board info but not breakpad dir"""
     ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbol(
         self.elf_file, board='foo')
     self.assertEqual(ret, 0)
     self.assertCommandArgs(0, ['dump_syms', self.elf_file])
     self.assertEqual(self.rc_mock.call_count, 1)
     self.assertExists(self.sym_file)
Пример #5
0
 def testNormal(self):
     """Normal run -- given an ELF and a debug file"""
     ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbol(
         self.elf_file, self.debug_file, breakpad_dir=self.breakpad_dir)
     self.assertEqual(ret, 0)
     self.assertEqual(self.rc_mock.call_count, 1)
     self.assertCommandArgs(0, ['dump_syms', self.elf_file, self.debug_dir])
     self.assertExists(self.sym_file)
 def testNormalSudo(self):
   """Normal run where ELF is readable only by root"""
   with mock.patch.object(os, 'access') as mock_access:
     mock_access.return_value = False
     ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbol(
         self.elf_file, breakpad_dir=self.breakpad_dir)
   self.assertEqual(ret, self.sym_file)
   self.assertCommandArgs(0, ['sudo', '--', 'dump_syms', '-v', self.elf_file])
Пример #7
0
 def testNormalNoCfi(self):
     """Normal run w/out CFI"""
     # Make sure the num_errors flag works too.
     num_errors = ctypes.c_int()
     ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbol(
         self.elf_file, strip_cfi=True, num_errors=num_errors)
     self.assertEqual(ret, 0)
     self.assertEqual(num_errors.value, 0)
     self.assertCommandArgs(0, ['dump_syms', '-c', self.elf_file])
     self.assertEqual(self.rc_mock.call_count, 1)
     self.assertExists(self.sym_file)
Пример #8
0
 def testLargeDebugFail(self):
     """Running w/large .debug failed, but retry worked"""
     self.rc_mock.AddCmdResult(['dump_syms', self.elf_file, self.debug_dir],
                               returncode=1)
     ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbol(
         self.elf_file, self.debug_file)
     self.assertEqual(ret, 0)
     self.assertEqual(self.rc_mock.call_count, 2)
     self.assertCommandArgs(0, ['dump_syms', self.elf_file, self.debug_dir])
     self.assertCommandArgs(
         1, ['dump_syms', '-c', '-r', self.elf_file, self.debug_dir])
     self.assertExists(self.sym_file)
Пример #9
0
 def testDebugFail(self):
     """Running w/.debug always failed, but works w/out"""
     self.rc_mock.AddCmdResult(['dump_syms', self.elf_file, self.debug_dir],
                               returncode=1)
     self.rc_mock.AddCmdResult(
         ['dump_syms', '-c', '-r', self.elf_file, self.debug_dir],
         returncode=1)
     ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbol(
         self.elf_file, self.debug_file)
     self.assertEqual(ret, 0)
     self.assertEqual(self.rc_mock.call_count, 3)
     self.assertCommandArgs(0, ['dump_syms', self.elf_file, self.debug_dir])
     self.assertCommandArgs(
         1, ['dump_syms', '-c', '-r', self.elf_file, self.debug_dir])
     self.assertCommandArgs(2, ['dump_syms', self.elf_file])
     self.assertExists(self.sym_file)