Exit code of exited inferiors in -list-thread-groups

Don't reset the exit code at inferior exit and print it in
-list-thread-groups.

gdb/ChangeLog:

	* NEWS: Announce new exit-code field in -list-thread-groups
	output.
	* inferior.c (exit_inferior_1): Don't clear exit code.
	(inferior_appeared): Clear exit code.
	* mi/mi-main.c (print_one_inferior): Add printing of the exit
	code.

gdb/testsuite/ChangeLog:

	* gdb.mi/mi-exit-code.exp: New file.
	* gdb.mi/mi-exit-code.c: New file.

gdb/doc/ChangeLog:

	* gdb.texinfo (Miscellaneous gdb/mi Commands): Document new
	exit-code field in -list-thread-groups output.
This commit is contained in:
Simon Marchi
2014-09-29 17:33:09 -04:00
parent 5fdeec1db0
commit 2ddf430110
9 changed files with 149 additions and 2 deletions

View File

@ -1,3 +1,12 @@
2014-10-01 Simon Marchi <simon.marchi@ericsson.com>
* NEWS: Announce new exit-code field in -list-thread-groups
output.
* inferior.c (exit_inferior_1): Don't clear exit code.
(inferior_appeared): Clear exit code.
* mi/mi-main.c (print_one_inferior): Add printing of the exit
code.
2014-10-01 Pedro Alves <palves@redhat.com> 2014-10-01 Pedro Alves <palves@redhat.com>
* features/Makefile ($(outdir)/%.dat): Output "THIS FILE IS * features/Makefile ($(outdir)/%.dat): Output "THIS FILE IS

View File

@ -40,6 +40,11 @@ queue-signal signal-name-or-number
even in non-stop mode. The "auto" mode has been removed, and "off" even in non-stop mode. The "auto" mode has been removed, and "off"
is now the default mode. is now the default mode.
* MI changes
** The -list-thread-groups command outputs an exit-code field for
inferiors that have exited.
*** Changes in GDB 7.8 *** Changes in GDB 7.8
* New command line options * New command line options

View File

@ -1,3 +1,8 @@
2014-10-01 Simon Marchi <simon.marchi@ericsson.com>
* gdb.texinfo (Miscellaneous gdb/mi Commands): Document new
exit-code field in -list-thread-groups output.
2014-09-22 Jan-Benedict Glaw <jbglaw@lug-owl.de> 2014-09-22 Jan-Benedict Glaw <jbglaw@lug-owl.de>
* gdb.texinfo (Set Breaks): Add missing "@end table". * gdb.texinfo (Set Breaks): Add missing "@end table".

View File

@ -31152,6 +31152,11 @@ valid type.
The target-specific process identifier. This field is only present The target-specific process identifier. This field is only present
for thread groups of type @samp{process} and only if the process exists. for thread groups of type @samp{process} and only if the process exists.
@item exit-code
The exit code of this group's last exited thread, formatted in octal.
This field is only present for thread groups of type @samp{process} and
only if the process is not running.
@item num_children @item num_children
The number of children this thread group has. This field may be The number of children this thread group has. This field may be
absent for an available thread group. absent for an available thread group.

View File

@ -275,8 +275,6 @@ exit_inferior_1 (struct inferior *inftoex, int silent)
inf->vfork_child = NULL; inf->vfork_child = NULL;
} }
inf->has_exit_code = 0;
inf->exit_code = 0;
inf->pending_detach = 0; inf->pending_detach = 0;
} }
@ -322,6 +320,8 @@ void
inferior_appeared (struct inferior *inf, int pid) inferior_appeared (struct inferior *inf, int pid)
{ {
inf->pid = pid; inf->pid = pid;
inf->has_exit_code = 0;
inf->exit_code = 0;
observer_notify_inferior_appeared (inf); observer_notify_inferior_appeared (inf);
} }

View File

@ -658,6 +658,9 @@ print_one_inferior (struct inferior *inferior, void *xdata)
ui_out_field_fmt (uiout, "id", "i%d", inferior->num); ui_out_field_fmt (uiout, "id", "i%d", inferior->num);
ui_out_field_string (uiout, "type", "process"); ui_out_field_string (uiout, "type", "process");
if (inferior->has_exit_code)
ui_out_field_string (uiout, "exit-code",
int_string (inferior->exit_code, 8, 0, 0, 1));
if (inferior->pid != 0) if (inferior->pid != 0)
ui_out_field_int (uiout, "pid", inferior->pid); ui_out_field_int (uiout, "pid", inferior->pid);

View File

@ -1,3 +1,8 @@
2014-10-01 Simon Marchi <simon.marchi@ericsson.com>
* gdb.mi/mi-exit-code.exp: New file.
* gdb.mi/mi-exit-code.c: New file.
2014-09-30 Yao Qi <yao@codesourcery.com> 2014-09-30 Yao Qi <yao@codesourcery.com>
* lib/prelink-support.exp (build_executable_own_libs): Error if * lib/prelink-support.exp (build_executable_own_libs): Error if

View File

@ -0,0 +1,27 @@
/* Copyright 1999-2014 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/>. */
int exit_code = 0;
int
main (int argc, char **argv)
{
if (argc > 1)
exit_code = atoi (argv[1]);
return exit_code;
}

View File

@ -0,0 +1,88 @@
# Copyright 1999-2014 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/>.
load_lib mi-support.exp
set MIFLAGS "-i=mi"
gdb_exit
if [mi_gdb_start] {
continue
}
standard_testfile
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
untested "failed to compile $testfile"
return -1
}
proc test_list_thread_groups { } {
global hex
global decimal
# Before any run, exit-code should not be present.
mi_gdb_test \
"122-list-thread-groups" \
"122\\^done,groups=\\\[\{id=\"i1\",type=\"process\"\}\]" \
"-list-thread-groups before run shows no exit-code"
with_test_prefix "first run" {
mi_run_to_main
# During the run, exit-code should not be present.
mi_gdb_test \
"123-list-thread-groups" \
"123\\^done,groups=\\\[\{id=\"i1\",type=\"process\",pid=\"$decimal\",executable=\".*\".*" \
"-list-thread-groups during run shows no exit-code"
# Exit the inferior.
mi_send_resuming_command "exec-continue" "continuing to inferior exit"
mi_expect_stop "exited-normally" "" "" "" "" "" "exit normally"
# After the run, exit-code should be present.
mi_gdb_test \
"124-list-thread-groups" \
"124\\^done,groups=\\\[\{id=\"i1\",type=\"process\",exit-code=\"0\",executable=\".*\"\}\]" \
"-list-thread-groups after exit shows exit-code"
}
with_test_prefix "second run" {
mi_run_to_main
# Write the exit code we want in the global var
mi_gdb_test "set var exit_code = 8" ".*\\^done" "write exit code"
# During the second run, exit-code should not be present.
mi_gdb_test \
"125-list-thread-groups" \
"125\\^done,groups=\\\[\{id=\"i1\",type=\"process\",pid=\"$decimal\",executable=\".*\".*" \
"-list-thread-groups during run shows no exit-code"
# Exit the inferior.
mi_send_resuming_command "exec-continue" "continuing to inferior exit"
mi_expect_stop "exited" "" "" "" "" "" "exit with code"
# After the second run, exit-code should be present.
mi_gdb_test \
"126-list-thread-groups" \
"126\\^done,groups=\\\[\{id=\"i1\",type=\"process\",exit-code=\"010\",executable=\".*\"\}\]" \
"-list-thread-groups after exit shows exit-code"
}
}
test_list_thread_groups
mi_gdb_exit
return 0