def main():
    logger = logging.getLogger()
    hdlr = logging.StreamHandler()
    logger.addHandler(hdlr)

    parser = OptionParser()
    parser.add_option('', '--debug', dest='debug', action='store_true', help='Enable debug messages (overrides --verbose)')
    parser.add_option('', '--verbose', dest='verbose', action='store_true', help='Enable verbose messages')
    (options, args) = parser.parse_args()

    if options.debug:
        logger.setLevel(logging.DEBUG)
    elif options.verbose:
        logger.setLevel(logging.INFO)
    else:
        logger.setLevel(logging.WARNING)

    for f in args:
        debugger = os.path.splitext(f)[1]
        if debugger == '.gdb':
            g = GDBfile(f)
        elif debugger == '.cw':
            g = CWfile(f)
        elif debugger == '':
            parser.error('No file suffix found, but \'.gdb\' or \'.cw\' expected')
        else:
            parser.error('Unknown file suffix \'%s\' found, but \'.gdb\' or \'.cw\' expected' % debugger)
        print 'Signature=%s' % g.get_testcase_signature(5)
        if g.registers_hex.get(g.pc_name):
            print 'PC=%s' % g.registers_hex[g.pc_name]
Ejemplo n.º 2
0
    def test_hashable_backtrace(self):
        gdbf = GDBfile(self.file)
        self.assertFalse(gdbf._hashable_backtrace())

        gdbf.lines.append('#0 0x11111111 in ??')
        gdbf.lines.append('#1 0x22222222 in foo at foo.c:80')
        gdbf.lines.append('#2 0x33333333 in bar')

        gdbf._process_lines()
        self.assertEqual(gdbf._hashable_backtrace(), ['0x11111111', 'foo.c:80', '0x33333333'])
Ejemplo n.º 3
0
    def test_is_debugbuild(self):
        g = GDBfile(self.file)
        self.assertFalse(g.is_debugbuild)

        fd = open(self.file, 'a')
        fd.write("Darmok and Jalad at Tanagra\n")
        fd.close()

        g = GDBfile(self.file)
        self.assertTrue(g.is_debugbuild)
Ejemplo n.º 4
0
    def test_registers(self):
        gdbf = GDBfile(self.file)
        self.assertFalse(gdbf.registers)

        for r in registers:
            gdbf.lines.append('%s\t0xf00\tbar' % r)

        gdbf._process_lines()

        for r in registers:
            self.assertEqual(gdbf.registers_hex[r], '0xf00')
            self.assertEqual(gdbf.registers[r], 'bar')
Ejemplo n.º 5
0
    def test_registers(self):
        gdbf = GDBfile(self.file)
        self.assertFalse(gdbf.registers)

        for r in registers:
            gdbf.lines.append('%s\t0xf00\tbar' % r)

        gdbf._process_lines()

        for r in registers:
            self.assertEqual(gdbf.registers_hex[r], '0xf00')
            self.assertEqual(gdbf.registers[r], 'bar')
Ejemplo n.º 6
0
    def test_backtrace_without_questionmarks(self):
        (fd, f) = tempfile.mkstemp(text=True)
        os.write(fd, "#0 A\n")
        os.write(fd, "#1 ?? B\n")
        os.write(fd, "C\n")
        os.write(fd, "#2 D at foo\n")
        os.close(fd)

        gdbf = GDBfile(f)
        gdbf._backtrace_without_questionmarks()
        self.assertEqual(gdbf.backtrace_without_questionmarks, ["A", "D at foo"])

        self.delete_file(f)
Ejemplo n.º 7
0
    def test_get_crash_signature(self):
        gdbf = GDBfile(self.file)
        self.assertFalse(gdbf._hashable_backtrace())

        gdbf.lines.append('#0 0x11111111 in ??')
        gdbf.lines.append('#1 0x22222222 in foo at foo.c:80')
        gdbf.lines.append('#2 0x33333333 in bar')

        gdbf._process_lines()
        gdbf._hashable_backtrace()
        self.assertEqual(gdbf.get_crash_signature(1), hashlib.md5('0x11111111').hexdigest())
        self.assertEqual(gdbf.get_crash_signature(2), hashlib.md5('0x11111111 foo.c:80').hexdigest())
        self.assertEqual(gdbf.get_crash_signature(3), hashlib.md5('0x11111111 foo.c:80 0x33333333').hexdigest())
Ejemplo n.º 8
0
    def test_hashable_backtrace_string(self):
        gdbf = GDBfile(self.file)
        self.assertFalse(gdbf._hashable_backtrace())

        gdbf.lines.append('#0 0x11111111 in ??')
        gdbf.lines.append('#1 0x22222222 in foo at foo.c:80')
        gdbf.lines.append('#2 0x33333333 in bar')

        gdbf._process_lines()
        gdbf._hashable_backtrace()
        self.assertEqual(gdbf._hashable_backtrace_string(1), '0x11111111')
        self.assertEqual(gdbf._hashable_backtrace_string(2), '0x11111111 foo.c:80')
        self.assertEqual(gdbf._hashable_backtrace_string(3), '0x11111111 foo.c:80 0x33333333')
Ejemplo n.º 9
0
    def test_read_gdb(self):
        gdb = GDBfile(self.file)
        lines = gdb.lines

        # make sure all three lines were returned
        self.assertEqual(len(lines), 3)
        for s in ("abc", "def", "ghi"):
            self.assertTrue(s in lines)
Ejemplo n.º 10
0
    def test_is_assert_fail(self):
        g = GDBfile(self.file)
        self.assertFalse(g.is_assert_fail)

        fd = open(self.file, 'a')
        fd.write("\n__assert_fail\n")
        fd.close()

        g = GDBfile(self.file)
        # it's not good enough to just have an assert fail string
        # anywhere in the input file
        self.assertFalse(g.is_assert_fail)

        # it has to be in the backtrace for it to count
        # as a real assertion failure for our purposes
        g.backtrace.append('__assert_fail')
        g._look_for_assert_fail()
        self.assertTrue(g.is_assert_fail)
Ejemplo n.º 11
0
def main():
    logger = logging.getLogger()
    hdlr = logging.StreamHandler()
    logger.addHandler(hdlr)

    parser = OptionParser()
    parser.add_option('',
                      '--debug',
                      dest='debug',
                      action='store_true',
                      help='Enable debug messages (overrides --verbose)')
    parser.add_option('',
                      '--verbose',
                      dest='verbose',
                      action='store_true',
                      help='Enable verbose messages')
    (options, args) = parser.parse_args()

    if options.debug:
        logger.setLevel(logging.DEBUG)
    elif options.verbose:
        logger.setLevel(logging.INFO)
    else:
        logger.setLevel(logging.WARNING)

    for f in args:
        debugger = os.path.splitext(f)[1]
        if debugger == '.gdb':
            g = GDBfile(f)
        elif debugger == '.cw':
            g = CWfile(f)
        elif debugger == '':
            parser.error(
                'No file suffix found, but \'.gdb\' or \'.cw\' expected')
        else:
            parser.error(
                'Unknown file suffix \'%s\' found, but \'.gdb\' or \'.cw\' expected'
                % debugger)
        print 'Signature=%s' % g.get_testcase_signature(5)
        if g.registers_hex.get(g.pc_name):
            print 'PC=%s' % g.registers_hex[g.pc_name]
Ejemplo n.º 12
0
    def test_received_signal(self):
        (fd, f) = tempfile.mkstemp(text=True)
        os.write(fd, "#0 A\n")
        os.write(fd, "#1 ?? B\n")
        os.write(fd, "C\n")
        os.write(fd, "#2 D at foo\n")
        os.write(fd, "Program received signal WINNING, Charlie Sheen fault.\n")
        os.close(fd)

        gdbf = GDBfile(f)
        self.assertEqual(gdbf.signal, "WINNING")

        self.delete_file(f)
Ejemplo n.º 13
0
    def test_is_crash(self):
        fd = open(self.file, 'a')
        fd.write("SIGKILL\n")
        fd.close()

        g = GDBfile(self.file)
        self.assertFalse(g.is_crash)

        # overwrite the file...
        fd = open(self.file, 'w')
        fd.write("SIGHUP\n")
        fd.close()

        g = GDBfile(self.file)
        self.assertFalse(g.is_crash)

        # overwrite the file...
        fd = open(self.file, 'w')
        fd.write("Program exited normally\n")
        fd.close()

        g = GDBfile(self.file)
        self.assertFalse(g.is_crash)
Ejemplo n.º 14
0
    def test_backtrace(self):
        (fd, f) = tempfile.mkstemp(text=True)
        os.write(fd, "#0 A\n")
        os.write(fd, "#1 B\n")
        os.write(fd, " from bar\n")
        os.write(fd, " at foo\n")
        os.write(fd, "C\n")
        os.write(fd, "#3 D\n")
        os.write(fd, "  X from baz\n")
        os.write(fd, "  N at qux\n")
        # this one should NOT show up because in the event
        # of a corrupt stack we drop the last backtrace line
        os.write(fd, "#4 E at blah\n")
        os.write(fd, "(corrupt stack?)\n")
        os.close(fd)

        gdbf = GDBfile(f)
        self.assertEqual(gdbf.backtrace, ["A", "B from bar at foo", "D X from baz N at qux"])

        self.delete_file(f)
Ejemplo n.º 15
0
    def go(self):
        '''
        Generates gdb output for <program> <cmd_args> into <outfile>.
        If gdb fails to complete before <timeout>,
        attempt to _kill gdb and program.

        @return: a GDBfile object with the parsed results
        '''
        # build the command line in a separate function so we can unit test
        # it without actually running the command
        cmdline = self._get_cmdline()
        subp.run_with_timer(cmdline,
                            self.timeout,
                            self.program,
                            stdout=os.devnull)

        self._remove_temp_file()
        if not os.path.exists(self.outfile):
            # touch it if it doesn't exist
            open(self.outfile, 'w').close()
        return GDBfile(self.outfile, self.exclude_unmapped_frames,
                       self.keep_uniq_faddr)
Ejemplo n.º 16
0
    def test_is_assert_fail(self):
        g = GDBfile(self.file)
        self.assertFalse(g.is_assert_fail)

        fd = open(self.file, 'a')
        fd.write("\n__assert_fail\n")
        fd.close()

        g = GDBfile(self.file)
        # it's not good enough to just have an assert fail string
        # anywhere in the input file
        self.assertFalse(g.is_assert_fail)

        # it has to be in the backtrace for it to count
        # as a real assertion failure for our purposes
        g.backtrace.append('__assert_fail')
        g._look_for_assert_fail()
        self.assertTrue(g.is_assert_fail)
Ejemplo n.º 17
0
 def test_is_corrupt_stack(self):
     g = GDBfile(self.file)
     g._look_for_corrupt_stack('foo bar')
     self.assertFalse(g.is_corrupt_stack)
     g._look_for_corrupt_stack('corrupt stack')
     self.assertTrue(g.is_corrupt_stack)
Ejemplo n.º 18
0
 def test_is_corrupt_stack(self):
     g = GDBfile(self.file)
     g._look_for_corrupt_stack('foo bar')
     self.assertFalse(g.is_corrupt_stack)
     g._look_for_corrupt_stack('corrupt stack')
     self.assertTrue(g.is_corrupt_stack)
Ejemplo n.º 19
0
    parser = OptionParser()
    parser.add_option('',
                      '--debug',
                      dest='debug',
                      action='store_true',
                      help='Enable debug messages (overrides --verbose)')
    parser.add_option('',
                      '--verbose',
                      dest='verbose',
                      action='store_true',
                      help='Enable verbose messages')
    (options, args) = parser.parse_args()

    if options.debug:
        logger.setLevel(logging.DEBUG)
    elif options.verbose:
        logger.setLevel(logging.INFO)
    else:
        logger.setLevel(logging.WARNING)

    for f in args:
        debugger = os.path.splitext(f)[1]
        if debugger == '.gdb':
            g = GDBfile(f)
        elif debugger == '.cw':
            g = CWfile(f)
        print 'Signature=%s' % g.get_crash_signature(5)
        if g.registers_hex.get(g.pc_name):
            print 'PC=%s' % g.registers_hex[g.pc_name]
Ejemplo n.º 20
0
logger = logging.getLogger(__name__)
logger.setLevel(logging.WARNING)

if __name__ == '__main__':
    logger = logging.getLogger()
    hdlr = logging.StreamHandler()
    logger.addHandler(hdlr)

    parser = OptionParser()
    parser.add_option('', '--debug', dest='debug', action='store_true', help='Enable debug messages (overrides --verbose)')
    parser.add_option('', '--verbose', dest='verbose', action='store_true', help='Enable verbose messages')
    (options, args) = parser.parse_args()

    if options.debug:
        logger.setLevel(logging.DEBUG)
    elif options.verbose:
        logger.setLevel(logging.INFO)
    else:
        logger.setLevel(logging.WARNING)

    for f in args:
        debugger = os.path.splitext(f)[1]
        if debugger == '.gdb':
            g = GDBfile(f)
        elif debugger == '.cw':
            g = CWfile(f)
        print 'Signature=%s' % g.get_crash_signature(5)
        if g.registers_hex.get(g.pc_name):
            print 'PC=%s' % g.registers_hex[g.pc_name]