Fix -list-thread-groups --available logic and add test

New in v3:

- Replace use_gdb_stub with can_spawn_for_attach.
- Call kill_wait_spawned_process on spawn_ids.

Commit

  Use std::set in mi-main.c
  52f9abe4c7

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.
This commit is contained in:
Simon Marchi 2017-10-04 12:44:01 -04:00
parent 73dcd72d4e
commit 4c71c1059f
5 changed files with 111 additions and 1 deletions

View File

@ -1,3 +1,7 @@
2017-10-04 Simon Marchi <simon.marchi@ericsson.com>
* mi/mi-main.c (list_available_thread_groups): Reverse filter logic.
2017-10-04 Pedro Alves <palves@redhat.com>
* guile/scm-breakpoint.c (gdbscm_breakpoint_commands): Move code

View File

@ -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);

View File

@ -1,3 +1,8 @@
2017-10-04 Simon Marchi <simon.marchi@ericsson.com>
* gdb.mi/list-thread-groups-available.exp: New file.
* gdb.mi/list-thread-groups-available.c: New file.
2017-10-04 Sergio Durigan Junior <sergiodj@redhat.com>
* gdb.base/set-cwd.exp: Make it available on

View File

@ -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;
}

View File

@ -0,0 +1,72 @@
# 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 ![can_spawn_for_attach] {
continue
}
set string_re {(?:[^\\"]|\\.)*}
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\")*\]"
# List all available processes.
set process_entry_re "{${id_re},${type_re}(,$description_re)?(,$user_re)?(,$cores_re)?}"
mi_gdb_test \
"-list-thread-groups --available" \
"\\^done,groups=\\\[${process_entry_re}(,$process_entry_re)*\\\]" \
"list available thread groups"
# List specific processes, make sure there are two entries.
set spawn_id_1 [remote_spawn target $binfile]
set pid_1 [spawn_id_get_pid $spawn_id_1]
set id_re_1 "id=\"$pid_1\""
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\""
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)?}"
set process_list_re "(${process_entry_re_1},${process_entry_re_2}|${process_entry_re_2},${process_entry_re_1})"
mi_gdb_test \
"-list-thread-groups --available i${pid_1} i${pid_2}" \
"\\^done,groups=\\\[${process_list_re}\\\]" \
"list available thread groups with filter"
kill_wait_spawned_process $spawn_id_1
kill_wait_spawned_process $spawn_id_2