diff options
author | Tim Newsome <tim@sifive.com> | 2018-04-09 13:09:55 -0700 |
---|---|---|
committer | Tim Newsome <tim@sifive.com> | 2018-04-09 13:11:36 -0700 |
commit | df93b0dc9a6580b4f74a10c50190e008d57f41f4 (patch) | |
tree | 944f34d9bb4f98fc804444003a6681547bc5c376 /debug | |
parent | d63a6a4ad0057614d1c838c1b506b6fa0032de01 (diff) | |
download | riscv-tests-df93b0dc9a6580b4f74a10c50190e008d57f41f4.zip riscv-tests-df93b0dc9a6580b4f74a10c50190e008d57f41f4.tar.gz riscv-tests-df93b0dc9a6580b4f74a10c50190e008d57f41f4.tar.bz2 |
Compute gdb command timeout based on ops estimate
The caller of gdb.command() should estimate how much work gdb needs to
do, and testlib then scales this up proportional to the general gdb
timeout we configured. This hopefully allows us to configure a tighter
timeout, so we don't have to have a multi-hour timeout just for
something that takes long like `load` on a really slow simulator.
Hopefully this addresses #122.
Diffstat (limited to 'debug')
-rwxr-xr-x | debug/gdbserver.py | 2 | ||||
-rw-r--r-- | debug/testlib.py | 30 |
2 files changed, 18 insertions, 14 deletions
diff --git a/debug/gdbserver.py b/debug/gdbserver.py index c7bfbf0..d085e2e 100755 --- a/debug/gdbserver.py +++ b/debug/gdbserver.py @@ -835,7 +835,7 @@ class DownloadTest(GdbTest): def test(self): self.gdb.load() self.gdb.command("b _exit") - self.gdb.c(timeout=60) + self.gdb.c() assertEqual(self.gdb.p("status"), self.crc) os.unlink(self.download_c.name) diff --git a/debug/testlib.py b/debug/testlib.py index 2fa70df..38ae33b 100644 --- a/debug/testlib.py +++ b/debug/testlib.py @@ -424,7 +424,7 @@ class Gdb(object): h = self.harts[hart.id] self.select_child(h['child']) if not h['solo']: - output = self.command("thread %s" % h['thread'].id, timeout=10) + output = self.command("thread %s" % h['thread'].id, ops=5) assert "Unknown" not in output def push_state(self): @@ -440,8 +440,11 @@ class Gdb(object): """Wait for prompt.""" self.active_child.expect(r"\(gdb\)") - def command(self, command, timeout=6000): - """timeout is in seconds""" + def command(self, command, ops=1): + """ops is the estimated number of operations gdb will have to perform + to perform this command. It is used to compute a timeout based on + self.timeout.""" + timeout = ops * self.timeout self.active_child.sendline(command) self.active_child.expect("\n", timeout=timeout) self.active_child.expect(r"\(gdb\)", timeout=timeout) @@ -454,7 +457,7 @@ class Gdb(object): self.select_child(child) self.command(command) - def c(self, wait=True, timeout=-1, async=False): + def c(self, wait=True, async=False): """ Dumb c command. In RTOS mode, gdb will resume all harts. @@ -465,13 +468,14 @@ class Gdb(object): async = "&" else: async = "" + ops = 10 if wait: - output = self.command("c%s" % async, timeout=timeout) + output = self.command("c%s" % async, ops=ops) assert "Continuing" in output return output else: self.active_child.sendline("c%s" % async) - self.active_child.expect("Continuing") + self.active_child.expect("Continuing", timeout=ops * self.timeout) def c_all(self): """ @@ -538,28 +542,28 @@ class Gdb(object): return value def stepi(self): - output = self.command("stepi", timeout=60) + output = self.command("stepi", ops=10) return output def load(self): - output = self.command("load", timeout=6000) + output = self.command("load", ops=1000) assert "failed" not in output assert "Transfer rate" in output def b(self, location): - output = self.command("b %s" % location) + output = self.command("b %s" % location, ops=5) assert "not defined" not in output assert "Breakpoint" in output return output def hbreak(self, location): - output = self.command("hbreak %s" % location) + output = self.command("hbreak %s" % location, ops=5) assert "not defined" not in output assert "Hardware assisted breakpoint" in output return output def threads(self): - output = self.command("info threads") + output = self.command("info threads", ops=100) threads = [] for line in output.splitlines(): m = re.match( @@ -842,8 +846,8 @@ class GdbTest(BaseTest): if not self.gdb: return self.gdb.interrupt() - self.gdb.command("disassemble") - self.gdb.command("info registers all", timeout=10) + self.gdb.command("disassemble", ops=20) + self.gdb.command("info registers all", ops=100) def classTeardown(self): del self.gdb |