[v5] Exit code of exited inferiors in -list-thread-groups
Commit Message
On 2014-09-29 05:42 PM, Simon Marchi wrote:
> On 2014-06-04 02:09 PM, Tom Tromey wrote:
>> Pedro> Sure, but that's not the point. The point is that frontend might
>> Pedro> not be _parsing_ the number _at all_, but just presenting it as a
>> Pedro> string to the user as is (*).
>>
>> It's unfortunate that we can even be in this situation.
>>
>> I don't object to using octal. I was unaware of the precedent.
>>
>> However now it seems that it would be an improvement to document that
>> the exit code is emitted in octal.
>>
>> Tom
>
> I am cleaning up the branches of my git repo and realized that this patch fell
> between the cracks.
>
> Since it was OKed a long time ago by Pedro [1] in pretty much the same form as
> this one, I will push it as follows tomorrow if nobody objects. The only change:
> As Tom suggested, I added a mention in the doc that the field is formatted in octal.
>
> [1] https://sourceware.org/ml/gdb-patches/2013-06/msg00768.html
Arrrrg. Forgot to add the files in gdb/testsuite. Here's the complete patch:
Sorry for the noise.
From 3ab8fbf4b1585caee116b59103fd717e10f21086 Mon Sep 17 00:00:00 2001
From: Simon Marchi <simon.marchi@ericsson.com>
Date: Mon, 29 Sep 2014 17:33:09 -0400
Subject: [PATCH] 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.
---
gdb/NEWS | 5 ++
gdb/doc/gdb.texinfo | 5 ++
gdb/inferior.c | 4 +-
gdb/mi/mi-main.c | 3 ++
gdb/testsuite/gdb.mi/mi-exit-code.c | 27 +++++++++++
gdb/testsuite/gdb.mi/mi-exit-code.exp | 88 +++++++++++++++++++++++++++++++++++
6 files changed, 130 insertions(+), 2 deletions(-)
create mode 100644 gdb/testsuite/gdb.mi/mi-exit-code.c
create mode 100644 gdb/testsuite/gdb.mi/mi-exit-code.exp
Comments
> Date: Mon, 29 Sep 2014 17:45:09 -0400
> From: Simon Marchi <simon.marchi@ericsson.com>
> CC: <gdb-patches@sourceware.org>
>
> Arrrrg. Forgot to add the files in gdb/testsuite. Here's the complete patch:
Thanks.
> +* MI changes
> +
> + ** The -list-thread-groups command outputs an exit-code firld for
> + inferiors that have exited. ^^^^^
A typo.
> +@item exit-code
> +The exit code of this thread group when it last exited, formatted in octal.
"The exit code of this group's last exited thread, formatted in octal."
The documentation parts are okay with these fixed.
@@ -40,6 +40,11 @@ queue-signal signal-name-or-number
even in non-stop mode. The "auto" mode has been removed, and "off"
is now the default mode.
+* MI changes
+
+ ** The -list-thread-groups command outputs an exit-code firld for
+ inferiors that have exited.
+
*** Changes in GDB 7.8
* New command line options
@@ -31152,6 +31152,11 @@ valid type.
The target-specific process identifier. This field is only present
for thread groups of type @samp{process} and only if the process exists.
+@item exit-code
+The exit code of this thread group when it last exited, 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
The number of children this thread group has. This field may be
absent for an available thread group.
@@ -275,8 +275,6 @@ exit_inferior_1 (struct inferior *inftoex, int silent)
inf->vfork_child = NULL;
}
- inf->has_exit_code = 0;
- inf->exit_code = 0;
inf->pending_detach = 0;
}
@@ -322,6 +320,8 @@ void
inferior_appeared (struct inferior *inf, int pid)
{
inf->pid = pid;
+ inf->has_exit_code = 0;
+ inf->exit_code = 0;
observer_notify_inferior_appeared (inf);
}
@@ -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_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)
ui_out_field_int (uiout, "pid", inferior->pid);
new file mode 100644
@@ -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;
+}
new file mode 100644
@@ -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