Age | Commit message (Collapse) | Author | Files | Lines |
|
Debug: suppress `PRNG seed ...` log messages when `gdbserver.py --list-tests <target>` used
|
|
|
|
|
|
testlib.py:run_all_tests()
|
|
present in pexpect match
Problem was observed on UnavailableMultiTest - this test was sporadically failing.
When the failure was observed the log of the failing test looked as follows:
```
File "/whatever/RISCVTests/debug/testlib.py", line 504, in <genexpr>
if all(targets[hart.id]["State"] == "running" for hart in harts):
~~~~~~~~~~~~~~~~^^^^^^^^^
KeyError: 'State'
```
Adding this modification to testlib.py
```
--- a/debug/testlib.py
+++ b/debug/testlib.py
@@ -498,6 +498,10 @@ class Openocd:
for line in lines[2:]:
if line.strip():
data.append(dict(zip(headers, line.split()[1:])))
+ str_data = str(data)
+ sys.stdout.flush()
+ sys.stdout.write(f"parsed targets:\n{result}\n===\n{str_data}\n---\n")
+ sys.stdout.flush()
return data
```
Allowed me to root cause the issue. Namely we have the following
situation:
```
parsed targets:
Exception ignored in: <function _TemporaryFileCloser.__del__ at 0x7f2dee64d1c0>
Traceback (most recent call last):
File "/usr/local/lib/python3.11/tempfile.py", line 450, in __del__
self.close()
File "/usr/local/lib/python3.11/tempfile.py", line 446, in close
unlink(self.name)
FileNotFoundError: [Errno 2] No such file or directory: '/tmp/gdb@38873-8s6ud03x.log'
...
TargetName Type Endian TapName State
-- ------------------ ---------- ------ ------------------ ------------
0 riscv.cpu0 riscv little riscv.cpu running
1* riscv.cpu1 riscv little riscv.cpu running
===
[{'Exception': '"/usr/local/lib/python3.11/tempfile.py",', 'ignored': 'line', 'in:': '450,', ...
```
The only reasonable (to me) explanation for the observed behavior is below.
Here is how we connect to TCL-RPC server:
```
self.openocd_cli = pexpect.spawn(f"nc localhost {self.tclrpc_port}")
tty.setraw(self.openocd_cli.child_fd)
```
Later we request target list by issuing "targets" command:
```
self.command("targets")
```
Internally, pexpect.spawn implemented as follows:
- we fork the process
- set up pty and then call execve
- all these steps are written in python
"Exception ignored" messages are result of exceptions thrown from
finalizers of NamedTemporaryFile objects. When exception is thrown from
the finalizer - python unconditionally prints a "warning" to stderr. It
seems that these messages are polluting our output from "nc" since python
GC can be invoked before the execve syscall.
The workaround is just to make sure that execve was executed before we
rely on the format of command output. To have such a guarantee we just
issue a dummy "echo" command and check that we have a proper reply in the
output stream.
While this explanation looks convincing, the behavior above still looks
strange, given that we have https://bugs.python.org/issue14548 which
was resolved long ago.
However, the proposed workaround fixes the issue.
|
|
This patch fixes the case when we are using an empty exception list (for example just a YAML file with comments but without any test items to skip).
|
|
fixes setting of `remotetimeout`. It was silently overwritten by default
values from platform definition even if user specified one.
|
|
introduce a new option to log communications over GDB remote serial
protocol which is helpful for debugging some tests.
|
|
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.
|
|
log file
Quick and dirty fix for https://github.com/riscv-software-src/riscv-tests/issues/520
|
|
Disable timer interrupt to fix some bugs
|
|
Signed-off-by: liangzhen <zhen.liang@spacemit.com>
|
|
debug: Add Openocd.set_available()
|
|
debug: Better interlock when interacting with gdb CLI.
|
|
This helper uses dmi_write commands to mark harts
available/unavailable.
|
|
debug: Make Openocd.targets() tolerate blank lines.
|
|
debug: Fix interrupt_all() to restore state.
|
|
Actually wait for the command to be echoed back. This means we won't be
confused if there are extra newlines in gdb output.
|
|
|
|
|
|
This lets you reproduce a test running on a specific hart.
|
|
During the github workflow this character is \n, while on my computer
it's ' '. I'm sure there's a good reason for that, but it doesn't seem
worth figuring out what that reason is.
|
|
Use new spike mechanism to test OpenOCD behavior when the current hart
becomes unavailable while running.
Create ThreadTerminated exception.
|
|
Use the new spike mechanism to test OpenOCD behavior when a hart becomes
unavailable while running.
Create CommandException.
|
|
It's a bit messy to read the log file to get the output, but it seems to
be flushed often so that this works.
Also, added the `targets` method for retrieving the list of targets,
and `wait_until_running` method to wait until all targets are in a
running state.
|
|
|
|
Just so it's easier to quickly comment out code and hard-code the target
to use without pylint complaining. This really should be a command line
option.
|
|
Github workflow to run pylint against debug tests
|
|
I'm using this to greatly reduce the timeout when I'm reproducing a
failure I know is going to time out.
|
|
|
|
Add a way to exclude tests by specifying an exclusion file
|
|
This patch adds a way to specify a yaml file which specifies either
for each target individually or for all targets to exclude tests.
Example file format is included in excluded.yaml.example.
|
|
If the environment variables aren't set, then use the same defaults as
previously.
My current set of tools use riscv64-elf-gcc and riscv64-elf-gdb, and
this makes it trivial to use them.
|
|
- Replace general "Exception" with "GdbServerError" in gdbserver.py for when no
samples are collected
- Replace general "Exception" with "TargetsException" in targets.py for XLEN
mismatch
- Introduce "TestLibError" exception in testlib.py and replace general
exceptions in various locations
- Update pylint.rc to remove overgeneral-exceptions warning
|
|
|
|
|
|
Test that we work correctly when the hart we're debugging ceases to
respond during stepi.
Add wait parameter to Gdb.stepi(), in case stepi isn't expected to complete.
Parse "could not read registers" error from gdb
|
|
Confirm basic debug still works when other harts have been parked using
a `cease` instruction. Check that the unavailable harts are inaccessible
from gdb.
Add Gdb.expect()
Parse "unknown thread" error from gdb.
|
|
Also make the semi-hosting test program return 10. That's more fragile
than returning 0, so makes for a better test.
|
|
|
|
This gives you less noise in the log, and more chance of figuring out
what code was actually executed.
|
|
`flush regs` is being deprecated.
|
|
`cease` is not a standard RISC-V extension, but is (was?) implemented in
Rocket, and also exists in some SiFive cores. It's useful to test
OpenOCD behavior when a hart becomes unavailable.
See also https://github.com/chipsalliance/rocket-chip/issues/1868
|
|
|
|
Between October 13 and October 19, something happened that makes the
multi-spike tests 4 times slower. Rolling back spike, OpenOCD, or
riscv-tests doesn't affect this. Presumably it's due to a kernel or
python change in my Ubuntu system.
I don't have time to look at this right now, so just increase the timeouts. :-(
If I had to guess, there could be a bug in rbb_daisychain.py that wastes
a lot of time.
|
|
Fix long line to make pylint happy.
|
|
|
|
Using the new spike support merged in
https://github.com/riscv-software-src/riscv-isa-sim/pull/1109
|
|
Not as useful as I'd like because we don't connect until after examine()
has completed, and the test is likely to time out while debugging. But
good to have, and maybe I'll expand on it one day.
|
|
The control sequences (^[[?2004h and ^[[?2004l) occur after the
gdb.command, which results in Exception fault. This commit removes the
control sequences and strips out the blank lines (^M).
|