From: Richard Xia Date: Fri, 4 Nov 2016 23:18:38 +0000 (-0700) Subject: Tell OpenOCD to pick an unused port, and use lsof to figure out which one it picked. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=14b56c155ded80ba7f5a5f6194cef83d654c16d8;p=riscv-tests.git Tell OpenOCD to pick an unused port, and use lsof to figure out which one it picked. --- diff --git a/debug/testlib.py b/debug/testlib.py index b20e2ff..40daad5 100644 --- a/debug/testlib.py +++ b/debug/testlib.py @@ -130,11 +130,10 @@ class Openocd(object): if debug: cmd.append("-d") - # Assign port - self.port = unused_port() # This command needs to come before any config scripts on the command # line, since they are executed in order. - cmd[1:1] = ["--command", "gdb_port %d" % self.port] + # Tell OpenOCD to bind to an unused port. + cmd[1:1] = ["--command", "gdb_port %d" % 0] logfile = open(Openocd.logname, "w") logfile.write("+ %s\n" % " ".join(cmd)) @@ -158,6 +157,31 @@ class Openocd(object): messaged = True print "Waiting for OpenOCD to examine RISCV core..." + self.port = self._get_gdb_server_port() + + def _get_gdb_server_port(self): + """Get port that OpenOCD's gdb server is listening on.""" + MAX_ATTEMPTS = 5 + PORT_REGEX = re.compile(r'(?P\d+) \(LISTEN\)') + for _ in range(MAX_ATTEMPTS): + with open(os.devnull, 'w') as devnull: + output = subprocess.check_output([ + 'lsof', + '-a', # Take the AND of the following selectors + '-p{}'.format(self.process.pid), # Filter on PID + '-iTCP', # Filter only TCP sockets + ], stderr=devnull) + matches = list(PORT_REGEX.finditer(output)) + if len(matches) > 1: + raise Exception( + "OpenOCD listening on multiple ports. Cannot uniquely " + "identify gdb server port.") + elif matches: + [match] = matches + return int(match.group('port')) + time.sleep(1) + raise Exception("Timed out waiting for gdb server to obtain port.") + def __del__(self): try: self.process.kill()