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]
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'])
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)
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')
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)
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())
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')
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)
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)
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]
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)
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)
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)
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)
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)
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]
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]