From 9b04ba41669e8f408f89148fb13f41a196f1fd14 Mon Sep 17 00:00:00 2001 From: Parshintsev Anatoly Date: Wed, 31 Jan 2024 00:14:44 +0300 Subject: [debug tests] print selected seed for PRNG Previously the seed was not printed and this created problems with reproduction of the issues. It's still not an ideal - meaning interactions between spike/gdb/openocd are inherently non-determistic (since time is involved), but at least we should get the same sources for the same seed now. --- debug/gdbserver.py | 9 +++++++++ debug/testlib.py | 3 +++ 2 files changed, 12 insertions(+) diff --git a/debug/gdbserver.py b/debug/gdbserver.py index 5450adb..f457b86 100755 --- a/debug/gdbserver.py +++ b/debug/gdbserver.py @@ -11,6 +11,7 @@ import os import re import itertools +from datetime import datetime import targets import testlib from testlib import assertEqual, assertNotEqual @@ -2194,6 +2195,14 @@ def main(): module = sys.modules[__name__] + # initialize PRNG + selected_seed = parsed.seed + if parsed.seed is None: + selected_seed = int(datetime.now().timestamp()) + print(f"PRNG seed for {target.name} is generated automatically") + print(f"PRNG seed for {target.name} is {selected_seed}") + random.seed(selected_seed) + return testlib.run_all_tests(module, target, parsed) # TROUBLESHOOTING TIPS diff --git a/debug/testlib.py b/debug/testlib.py index 7f28186..a50a488 100644 --- a/debug/testlib.py +++ b/debug/testlib.py @@ -1232,6 +1232,9 @@ def add_test_run_options(parser): help="Specify yaml file listing tests to exclude") parser.add_argument("--target-timeout", help="Override the base target timeout.", default=None, type=int) + parser.add_argument("--seed", + help="Use user-specified seed value for PRNG.", default=None, + type=int) parser.add_argument("--hart", help="Run tests against this hart in multihart tests.", default=None, type=int) -- cgit v1.1 From b89570c845e21b0dbf94b93a9685542002eda957 Mon Sep 17 00:00:00 2001 From: Parshintsev Anatoly Date: Thu, 1 Feb 2024 20:52:54 +0300 Subject: [debug tests] add option to log GDB remote serial protocol introduce a new option to log communications over GDB remote serial protocol which is helpful for debugging some tests. --- debug/testlib.py | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/debug/testlib.py b/debug/testlib.py index a50a488..79a6a56 100644 --- a/debug/testlib.py +++ b/debug/testlib.py @@ -708,7 +708,8 @@ class Gdb: 11, 149, 107, 163, 73, 47, 43, 173, 7, 109, 101, 103, 191, 2, 139, 97, 193, 157, 3, 29, 79, 113, 5, 89, 19, 37, 71, 179, 59, 137, 53) - def __init__(self, target, ports, cmd=None, timeout=60, binaries=None): + def __init__(self, target, ports, cmd=None, timeout=60, binaries=None, + logremote=False): assert ports self.target = target @@ -744,6 +745,16 @@ class Gdb: self.command("set print entry-values no", reset_delays=None) self.command(f"set remotetimeout {self.timeout}", reset_delays=None) self.command(f"set remotetimeout {self.target.timeout_sec}") + if logremote: + # pylint: disable-next=consider-using-with + remotelog = tempfile.NamedTemporaryFile( + prefix=f"remote.gdb@{port}-", suffix=".log") + if print_log_names: + real_stdout.write( + f"Temporary remotelog: {remotelog.name}\n") + self.logfiles.append(remotelog) + self.command(f"set remotelogfile {remotelog.name}", + reset_delays=None) self.active_child = self.children[0] def connect(self): @@ -1124,6 +1135,8 @@ def run_all_tests(module, target, parsed): gcc_cmd = parsed.gcc global target_timeout # pylint: disable=global-statement target_timeout = parsed.target_timeout + global remotelogfile_enable # pylint: disable=global-statement + remotelogfile_enable = parsed.remotelogfile_enable examine_added = False for hart in target.harts: @@ -1235,6 +1248,10 @@ def add_test_run_options(parser): parser.add_argument("--seed", help="Use user-specified seed value for PRNG.", default=None, type=int) + parser.add_argument("--remotelogfile-enable", + help="If specified save GDB will record remote session to a file", + action="store_true", + default=False) parser.add_argument("--hart", help="Run tests against this hart in multihart tests.", default=None, type=int) @@ -1383,6 +1400,7 @@ class BaseTest: gdb_cmd = None target_timeout = None +remotelogfile_enable = False class GdbTest(BaseTest): def __init__(self, target, hart=None): BaseTest.__init__(self, target, hart=hart) @@ -1399,7 +1417,8 @@ class GdbTest(BaseTest): self.gdb = Gdb(self.target, self.server.gdb_ports, cmd=gdb_cmd, timeout=target_timeout or self.target.timeout_sec, - binaries=self.binaries) + binaries=self.binaries, + logremote=remotelogfile_enable) self.logs += self.gdb.lognames() self.gdb.connect() -- cgit v1.1 From 787829a1b5d796961769a50e4731dd8a4dd6356e Mon Sep 17 00:00:00 2001 From: Parshintsev Anatoly Date: Wed, 31 Jan 2024 00:14:44 +0300 Subject: [debug tests] fix setting of remotetimeout fixes setting of `remotetimeout`. It was silently overwritten by default values from platform definition even if user specified one. --- debug/testlib.py | 1 - 1 file changed, 1 deletion(-) diff --git a/debug/testlib.py b/debug/testlib.py index 79a6a56..1d3fd18 100644 --- a/debug/testlib.py +++ b/debug/testlib.py @@ -744,7 +744,6 @@ class Gdb: # Force consistency. self.command("set print entry-values no", reset_delays=None) self.command(f"set remotetimeout {self.timeout}", reset_delays=None) - self.command(f"set remotetimeout {self.target.timeout_sec}") if logremote: # pylint: disable-next=consider-using-with remotelog = tempfile.NamedTemporaryFile( -- cgit v1.1