Fix -list-thread-groups --available logic and add test
Commit Message
Commit
Use std::set in mi-main.c
52f9abe4c739f42cc5f80b2629276493ac6306f9
changed the logic of the "-list-thread-groups --available" by mistake
when a pid is passed. It prints all the processes except the one
specified by the given pid. The correct behavior is to only print the
process corresponding to that pid. this patch fixes that and adds a test.
gdb/ChangeLog:
* mi/mi-main.c (list_available_thread_groups): Reverse filter logic.
gdb/testsuite/ChangeLog:
* gdb.mi/list-thread-groups-available.exp: New file.
* gdb.mi/list-thread-groups-available.c: New file.
---
gdb/mi/mi-main.c | 2 +-
.../gdb.mi/list-thread-groups-available.c | 29 +++++++++++++
.../gdb.mi/list-thread-groups-available.exp | 48 ++++++++++++++++++++++
3 files changed, 78 insertions(+), 1 deletion(-)
create mode 100644 gdb/testsuite/gdb.mi/list-thread-groups-available.c
create mode 100644 gdb/testsuite/gdb.mi/list-thread-groups-available.exp
Comments
On 10/04/2017 03:00 PM, Simon Marchi wrote:
> +# List a specific process.
> +set spawn_id [remote_spawn target $binfile]
> +set pid [spawn_id_get_pid $spawn_id]
> +mi_gdb_test \
> + "-list-thread-groups --available i${pid}" \
> + "\\^done,groups=\\\[{id=\"${pid}\",type=\"process\",.*}\\\]" \
> + "list available thread groups with filter"
Won't that ".*" above end up matching more than one process, if
GDB's filtering ends up a bit borked? Can we be sure that
only one process comes out?
Thanks,
Pedro Alves
On 2017-10-04 10:14, Pedro Alves wrote:
> On 10/04/2017 03:00 PM, Simon Marchi wrote:
>
>> +# List a specific process.
>> +set spawn_id [remote_spawn target $binfile]
>> +set pid [spawn_id_get_pid $spawn_id]
>> +mi_gdb_test \
>> + "-list-thread-groups --available i${pid}" \
>> + "\\^done,groups=\\\[{id=\"${pid}\",type=\"process\",.*}\\\]" \
>> + "list available thread groups with filter"
>
> Won't that ".*" above end up matching more than one process, if
> GDB's filtering ends up a bit borked? Can we be sure that
> only one process comes out?
I tried designing it like that but found it was pretty difficult because
of the description field:
55
^done,groups=[{id="499",type="process",description="/home/emaisin/build/binutils-gdb/gdb/testsuite/outputs/gdb.mi/list-thread-groups-available/list-thread-groups-available",user="emaisin",cores=["1"]}]^M
If we have something like this:
groups=[{id="$decimal",type="process",description=".*",...}]
and there are two process entries, the .* in the description field could
match from the beginning of the first description field to the end of
the second description field. So we wouldn't catch that there are two
processes instead of one. And we can't really restrict its content,
because it could potentially include [,}"].
Do you have any idea on how to do this with a regex? The only "real"
solution I see is to have a proper MI parser that parses MI to a tcl
data structure, and assert that the list of groups is of length 1.
Simon
On 10/04/2017 03:32 PM, Simon Marchi wrote:
> On 2017-10-04 10:14, Pedro Alves wrote:
>> On 10/04/2017 03:00 PM, Simon Marchi wrote:
>>
>>> +# List a specific process.
>>> +set spawn_id [remote_spawn target $binfile]
>>> +set pid [spawn_id_get_pid $spawn_id]
>>> +mi_gdb_test \
>>> + "-list-thread-groups --available i${pid}" \
>>> + "\\^done,groups=\\\[{id=\"${pid}\",type=\"process\",.*}\\\]" \
>>> + "list available thread groups with filter"
>>
>> Won't that ".*" above end up matching more than one process, if
>> GDB's filtering ends up a bit borked? Can we be sure that
>> only one process comes out?
>
> I tried designing it like that but found it was pretty difficult because
> of the description field:
>
> 55
> ^done,groups=[{id="499",type="process",description="/home/emaisin/build/binutils-gdb/gdb/testsuite/outputs/gdb.mi/list-thread-groups-available/list-thread-groups-available",user="emaisin",cores=["1"]}]^M
>
>
> If we have something like this:
>
> groups=[{id="$decimal",type="process",description=".*",...}]
Instead of .*, how about matching "all but unquoted/terminating
double-quote" ?
See http://wiki.tcl.tk/989 for example (Match a "quoted string").
(Maybe there's an easier way to write that regex, haven't
really thought about it.)
>
> and there are two process entries, the .* in the description field could
> match from the beginning of the first description field to the end of
> the second description field. So we wouldn't catch that there are two
> processes instead of one. And we can't really restrict its content,
> because it could potentially include [,}"].
>
> Do you have any idea on how to do this with a regex? The only "real"
> solution I see is to have a proper MI parser that parses MI to a tcl
> data structure, and assert that the list of groups is of length 1.
A "real" parser would consume the "..." description string as a single
string by looking for an unescaped terminating double-quote. :-)
Thanks,
Pedro Alves
@@ -801,7 +801,7 @@ list_available_thread_groups (const std::set<int> &ids, int recurse)
/* At present, the target will return all available processes
and if information about specific ones was required, we filter
undesired processes here. */
- if (!ids.empty () && ids.find (pid_i) != ids.end ())
+ if (!ids.empty () && ids.find (pid_i) == ids.end ())
continue;
ui_out_emit_tuple tuple_emitter (uiout, NULL);
new file mode 100644
@@ -0,0 +1,29 @@
+/* Copyright 2017 Free Software Foundation, Inc.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <unistd.h>
+
+int
+main ()
+{
+ int i;
+
+ for (i = 0; i < 30; i++)
+ sleep (1);
+
+ return 0;
+}
new file mode 100644
@@ -0,0 +1,48 @@
+# Copyright 2017 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Test that -list-thread-groups --available works.
+
+load_lib mi-support.exp
+set MIFLAGS "-i=mi"
+
+standard_testfile
+
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
+ untested "failed to compile"
+ return -1
+}
+
+if [mi_gdb_start] {
+ continue
+}
+
+if [use_gdb_stub] {
+ continue
+}
+
+# List all available processes.
+mi_gdb_test \
+ "-list-thread-groups --available" \
+ "\\^done,groups=\\\[.*\\\]" \
+ "list available thread groups"
+
+# List a specific process.
+set spawn_id [remote_spawn target $binfile]
+set pid [spawn_id_get_pid $spawn_id]
+mi_gdb_test \
+ "-list-thread-groups --available i${pid}" \
+ "\\^done,groups=\\\[{id=\"${pid}\",type=\"process\",.*}\\\]" \
+ "list available thread groups with filter"