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_disconnect_raw(self): """ Connect/disconnect repeatedly from a remote debugger using raw commands """ self.log.info("Testing connecting and disconnecting repeatedly using " "raw commands") s = gdb.GDBServer() g = gdb.GDB() # Do 100 cycle of target (kind of connects) and disconnects for i in range(0, 100): cmd = '-target-select extended-remote :%s' % s.port r = g.cmd(cmd) self.assertEqual(r.result.class_, 'connected') r = g.cmd('-target-disconnect') self.assertEqual(r.result.class_, 'done') # manual server shutdown cmd = '-target-select extended-remote :%s' % s.port r = g.cmd(cmd) self.assertEqual(r.result.class_, 'connected') r = g.cli_cmd('monitor exit') self.assertEqual(r.result.class_, 'done') g.exit() s.exit()
def test_server_exit(self): """ Tests that the server is shutdown by using a monitor exit command """ self.log.info("Testing that a single server exits cleanly") s = gdb.GDBServer() s.exit() self.assertFalse(self.is_process_alive(s.process))
def test_server_stderr(self): self.log.info('Testing server stderr collection') s = gdb.GDBServer() s.exit() self.assertTrue(os.path.exists(s.stderr_path)) stderr_lines = genio.read_all_lines(s.stderr_path) listening_line = "Listening on port %s\n" % s.port self.assertIn(listening_line, stderr_lines)
def test_remote(self): """ Tests GDBRemote interaction with a GDBServer """ s = gdb.GDBServer() r = gdb.GDBRemote('127.0.0.1', s.port) r.connect() r.cmd("qSupported") r.cmd("qfThreadInfo") s.exit()
def test_connect_multiple_clients(self): """ Tests two or more connections to the same server raise an exception """ self.log.info("Testing that multiple clients cannot connect at once") s = gdb.GDBServer() c1 = gdb.GDB() c1.connect(s.port) c2 = gdb.GDB() self.assertRaises(ValueError, c2.connect, s.port) s.exit()
def test_server_stdout(self): self.log.info('Testing server stdout/stderr collection') s = gdb.GDBServer() c = gdb.GDB() c.connect(s.port) c.set_file(self.return99_binary_path) c.run() s.exit() self.assertTrue(os.path.exists(s.stdout_path)) self.assertTrue(os.path.exists(s.stderr_path)) stdout_lines = genio.read_all_lines(s.stdout_path) self.assertIn("return 99\n", stdout_lines)
def test_disconnect(self): """ Connect/disconnect repeatedly from a remote debugger using utilities """ self.log.info("Testing connecting and disconnecting repeatedly") s = gdb.GDBServer() g = gdb.GDB() for i in range(0, 100): r = g.connect(s.port) self.assertEqual(r.result.class_, 'connected') r = g.disconnect() self.assertEqual(r.result.class_, 'done') g.exit() s.exit()
def test_multiple_servers(self): """ Tests multiple server instances without any blocking or race condition """ self.log.info("Testing execution of multiple GDB server instances") process_count = 10 server_instances = [] for i in range(0, process_count): s = gdb.GDBServer() c = gdb.GDB() c.connect(s.port) c.cmd('show-version') c.disconnect() server_instances.append(s) for i in range(0, process_count): self.assertTrue(self.is_process_alive(server_instances[i].process)) server_instances[i].exit() self.assertFalse(self.is_process_alive(server_instances[i].process))
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 = f"-file-exec-and-symbols {self.return99_binary_path}" r = g.cmd(cmd) self.assertEqual(r.result.class_, "done") cmd = f"set remote exec-file {self.return99_binary_path}" r = g.cmd(cmd) self.assertEqual(r.result.class_, "done") cmd = f"-break-insert {'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.decode()) 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()