def test_remote_exec(self): """ Tests execution on a remote target """ self.log.info("Testing execution on a remote target") hit_breakpoint = False s = gdb.GDBServer() g = gdb.GDB() cmd = '-file-exec-and-symbols %s' % self.return99_binary_path r = g.cmd(cmd) self.assertEqual(r.result.class_, 'done') cmd = 'set remote exec-file %s' % self.return99_binary_path r = g.cmd(cmd) self.assertEqual(r.result.class_, 'done') cmd = "-break-insert %s" % 'main' r = g.cmd(cmd) self.assertEqual(r.result.class_, 'done') r = g.cmd('-exec-run') other_messages = g.read_until_break() for msg in other_messages: parsed_msg = gdb.parse_mi(msg) if (hasattr(parsed_msg, 'class_') and parsed_msg.class_ == 'stopped' and parsed_msg.result.reason == 'breakpoint-hit'): hit_breakpoint = True self.assertTrue(hit_breakpoint) g.exit() s.exit()
def test_generate_core(self): """ Load a file that will cause a segfault and produce a core dump """ self.log.info("Testing that a core dump will be generated") g = gdb.GDB() file_cmd = "-file-exec-and-symbols %s" % self.segfault_binary_path r = g.cmd(file_cmd) self.assertEqual(r.result.class_, 'done') run_cmd = "-exec-run" r = g.cmd(run_cmd) self.assertEqual(r.result.class_, 'running') other_messages = g.read_until_break() core_path = None for msg in other_messages: parsed_msg = gdb.parse_mi(msg) if (hasattr(parsed_msg, 'class_') and (parsed_msg.class_ == 'stopped') and (parsed_msg.result.signal_name == 'SIGSEGV')): core_path = "%s.core" % self.segfault_binary_path gcore_cmd = 'gcore %s' % core_path gcore_cmd = gdb.encode_mi_cli(gcore_cmd) r = g.cmd(gcore_cmd) self.assertEqual(r.result.class_, 'done') self.assertTrue(os.path.exists(core_path)) g.exit()
def wait_for_exit(self): """ Waits until debugger receives a message about the binary exit """ result = False messages = [] while True: try: msgs = self.gdb.read_until_break() messages += msgs except: pass try: msg = messages.pop(0) parsed_msg = gdb.parse_mi(msg) if gdb.is_exit(parsed_msg): self.result.exit_status = self._get_exit_status(parsed_msg) result = True break elif gdb.is_break_hit(parsed_msg): # waits on fifo read() until end of debug session is notified r = self.handle_break_hit(parsed_msg) if r == 'C': self.gdb.connect(self.gdb_server.port) if self._is_thread_stopped(): r = self.gdb.cli_cmd("continue") else: log.warn( 'Binary "%s" terminated inside the ' 'debugger before avocado was resumed. ' 'Because important information about the ' 'process was lost the results is ' 'undefined. The test is going to be ' 'skipped. Please let avocado finish the ' 'the execution of your binary to have ' 'dependable results.', self.binary) raise GDBInferiorProcessExitedError elif gdb.is_fatal_signal(parsed_msg): # waits on fifo read() until end of debug session is notified r = self.handle_fatal_signal(parsed_msg) log.warn( 'Because "%s" received a fatal signal, this test ' 'is going to be skipped.', self.binary) raise GDBInferiorProcessExitedError except IndexError: continue return result
def wait_for_exit(self): """ Waits until debugger receives a message about the binary exit """ result = False messages = [] while True: try: msgs = self.gdb.read_until_break() messages += msgs except: pass try: msg = messages.pop(0) parsed_msg = gdb.parse_mi(msg) if gdb.is_exit(parsed_msg): self.result.exit_status = self._get_exit_status(parsed_msg) result = True break elif gdb.is_break_hit(parsed_msg): # waits on fifo read() until end of debug session is notified r = self.handle_break_hit(parsed_msg) if r == 'C': self.gdb.connect(self.gdb_server.port) if self._is_thread_stopped(): r = self.gdb.cli_cmd("continue") else: log.warn('Binary "%s" terminated inside the ' 'debugger before avocado was resumed. ' 'Because important information about the ' 'process was lost the results is ' 'undefined. The test is going to be ' 'skipped. Please let avocado finish the ' 'the execution of your binary to have ' 'dependable results.', self.binary) raise GDBInferiorProcessExitedError elif gdb.is_fatal_signal(parsed_msg): # waits on fifo read() until end of debug session is notified r = self.handle_fatal_signal(parsed_msg) log.warn('Because "%s" received a fatal signal, this test ' 'is going to be skipped.', self.binary) raise GDBInferiorProcessExitedError except IndexError: continue return result