diff options
author | Tim Newsome <tim@sifive.com> | 2016-11-11 12:19:46 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-11-11 12:19:46 -0800 |
commit | 98a7fc66ec9342d6e3f1e3477c2e30d75f78c294 (patch) | |
tree | 32a967a8b4d775632b7b2c38adc34c8dd93751f3 | |
parent | f7bb852141c107722bdb0302d11b6f992a6991d5 (diff) | |
parent | da7763c222260acc4b5807a25c316f8710b80923 (diff) | |
download | riscv-tests-98a7fc66ec9342d6e3f1e3477c2e30d75f78c294.zip riscv-tests-98a7fc66ec9342d6e3f1e3477c2e30d75f78c294.tar.gz riscv-tests-98a7fc66ec9342d6e3f1e3477c2e30d75f78c294.tar.bz2 |
Merge pull request #35 from richardxia/have-openocd-pick-gdb-server-port
Tell OpenOCD to pick an unused port for gdb server
-rw-r--r-- | debug/testlib.py | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/debug/testlib.py b/debug/testlib.py index b20e2ff..b8e9ad4 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 = 50 + PORT_REGEX = re.compile(r'(?P<port>\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(0.1) + raise Exception("Timed out waiting for gdb server to obtain port.") + def __del__(self): try: self.process.kill() |