From 14b56c155ded80ba7f5a5f6194cef83d654c16d8 Mon Sep 17 00:00:00 2001 From: Richard Xia Date: Fri, 4 Nov 2016 16:18:38 -0700 Subject: [PATCH] Tell OpenOCD to pick an unused port, and use lsof to figure out which one it picked. --- debug/testlib.py | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) 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() -- 2.30.2