From a1609f1fbc6f3cebc9e7626bda9bd888a553662a Mon Sep 17 00:00:00 2001 From: Tim Newsome Date: Wed, 26 Jul 2017 07:56:35 -0700 Subject: [PATCH] Use new OpenOCD messages to determine gdb port. This is simpler and more reliable than playing around with lsof. Specifically, it works if the OpenOCD command is "strace openocd" while the previous code did not. --- debug/testlib.py | 49 ++++++++---------------------------------------- 1 file changed, 8 insertions(+), 41 deletions(-) diff --git a/debug/testlib.py b/debug/testlib.py index ce2ec2e..2aab8ab 100644 --- a/debug/testlib.py +++ b/debug/testlib.py @@ -207,8 +207,11 @@ class Openocd(object): messaged = False while True: log = open(Openocd.logname).read() - if "Ready for Remote Connections" in log: - break + m = re.search("Listening on port (\d+) for gdb connections", log) + if m: + self.port = int(m.group(1)) + break; + if not self.process.poll() is None: header("OpenOCD log") sys.stdout.write(log) @@ -216,46 +219,10 @@ class Openocd(object): "OpenOCD exited before completing riscv_examine()") if not messaged and time.time() - start > 1: messaged = True - print "Waiting for OpenOCD to examine RISCV core..." + print "Waiting for OpenOCD to start..." if time.time() - start > 60: raise Exception("ERROR: Timed out waiting for OpenOCD to " - "examine RISCV core") - - try: - self.port = self._get_gdb_server_port() - except: - header("OpenOCD log") - sys.stdout.write(log) - raise - - 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\d+) \(LISTEN\)') - for _ in range(MAX_ATTEMPTS): - with open(os.devnull, 'w') as devnull: - try: - 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) - except subprocess.CalledProcessError: - output = "" - matches = list(PORT_REGEX.finditer(output)) - matches = [m for m in matches - if m.group('port') not in ('6666', '4444')] - if len(matches) > 1: - print output - 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.") + "listen for gdb") def __del__(self): try: @@ -368,7 +335,7 @@ class Gdb(object): return value def stepi(self): - output = self.command("stepi") + output = self.command("stepi", timeout=60) return output def load(self): -- 2.30.2