From: Andrew Burgess <andrew.burgess@embecosm.com>
To: Pedro Alves <palves@redhat.com>
Cc: Simon Marchi <simon.marchi@polymtl.ca>, gdb-patches@sourceware.org
Subject: [PATCHv2] gdb: Fix instability in thread groups test
Date: Mon, 13 Aug 2018 21:45:00 -0000 [thread overview]
Message-ID: <20180813214531.GZ3155@embecosm.com> (raw)
In-Reply-To: <7ab394a0-f796-4ff3-65e2-c7db9d7063e7@redhat.com>
Here's an updated version of the patch based on previous feedback.
The new version has additional comments explaining why the regexp
allows an empty core list. I also only allow the empty core list
when we scan all processes, its only in this case we might hit an
exiting process. When we scan two known PIDs, I don't allow an empty
core list.
---
gdb: Fix instability in thread groups test
In the test script gdb.mi/list-thread-groups-available.exp we ask GDB
to list all thread groups, and match the output against a
regexp. Occasionally, I would see this test fail.
The expected output is a list of entries, each entry looking roughly
like this:
{id="<DECIMAL>",type="process",description="<STRING>",
user="<STRING>",cores=["<DECIMAL>","<DECIMAL>",...]}
All the fields after 'id' and 'type' are optional, and the 'cores'
list can contain 1 or more "<DECIMAL>" entries.
On my machine (Running Fedora 27, kernel 4.17.3-100.fc27.x86_64)
usually the 'description' is a non-empty string, and the 'cores' list
has at least one entry in it. But sometimes, very rarely, I'll see an
entry in the process group list where the 'description' is an empty
string, the 'user' is the string "?", and the 'cores' list is empty.
Such an entry looks like this:
{id="19863",type="process",description="",user="?",cores=[]}
I believe that this is caused by the process exiting while GDB is
scanning /proc for process information. The current code in
gdb/nat/linux-osdata.c is not (I think) resilient against exiting
processes.
This commit adjusts the regex that matches the 'cores' list so that an
empty list is acceptable, with this patch in place the test script
gdb.mi/list-thread-groups-available.exp never fails for me now.
I've only adjusted the cores regexp for the occasion when we have GDB
read information about all processes, its only in this case that we
might encounter an exiting process. When we read information about
two known PIDs, that we know will not exit for the duration of the
test, we require that the core list be non-empty.
gdb/testsuite/ChangeLog:
* gdb.mi/list-thread-groups-available.exp: Update test regexp.
---
gdb/testsuite/ChangeLog | 4 ++++
gdb/testsuite/gdb.mi/list-thread-groups-available.exp | 12 +++++++++++-
2 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/gdb/testsuite/gdb.mi/list-thread-groups-available.exp b/gdb/testsuite/gdb.mi/list-thread-groups-available.exp
index c4dab2a2c34..11eddd577a3 100644
--- a/gdb/testsuite/gdb.mi/list-thread-groups-available.exp
+++ b/gdb/testsuite/gdb.mi/list-thread-groups-available.exp
@@ -45,7 +45,11 @@ set id_re "id=\"$decimal\""
set type_re "type=\"process\""
set description_re "description=\"$string_re\""
set user_re "user=\"$string_re\""
-set cores_re "cores=\\\[\"$decimal\"(,\"$decimal\")*\\\]"
+
+# The CORES_RE regexp allows a process to be running on zero or more
+# cores. This can happen if a process exits while GDB is reading
+# information out of /proc.
+set cores_re "cores=\\\[(\"$decimal\"(,\"$decimal\")*)?\\\]"
# List all available processes.
set process_entry_re "{${id_re},${type_re}(,$description_re)?(,$user_re)?(,$cores_re)?}"
@@ -64,6 +68,12 @@ set spawn_id_2 [remote_spawn target $binfile]
set pid_2 [spawn_id_get_pid $spawn_id_2]
set id_re_2 "id=\"$pid_2\""
+# Unlike the earlier CORES_RE this list must contain at least one
+# core. Given that we know these processes will not exit while GDB is
+# reading their information from /proc we can expect at least one core
+# for each process.
+set cores_re "cores=\\\[\"$decimal\"(,\"$decimal\")*\\\]"
+
set process_entry_re_1 "{${id_re_1},${type_re}(,$description_re)?(,$user_re)?(,$cores_re)?}"
set process_entry_re_2 "{${id_re_2},${type_re}(,$description_re)?(,$user_re)?(,$cores_re)?}"
--
2.14.4
next prev parent reply other threads:[~2018-08-13 21:45 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-08-10 9:58 [PATCH] " Andrew Burgess
2018-08-10 21:26 ` Simon Marchi
2018-08-13 9:51 ` Pedro Alves
2018-08-13 11:41 ` Andrew Burgess
2018-08-13 12:03 ` Pedro Alves
2018-08-13 13:01 ` Andrew Burgess
2018-08-13 13:38 ` Pedro Alves
2018-08-13 21:45 ` Andrew Burgess [this message]
2018-08-14 11:37 ` [PATCHv2] " Pedro Alves
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180813214531.GZ3155@embecosm.com \
--to=andrew.burgess@embecosm.com \
--cc=gdb-patches@sourceware.org \
--cc=palves@redhat.com \
--cc=simon.marchi@polymtl.ca \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox