[v5] Exit code of exited inferiors in -list-thread-groups

Message ID 5429D2E5.8050203@ericsson.com
State Committed
Headers

Commit Message

Simon Marchi Sept. 29, 2014, 9:45 p.m. UTC
  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

Eli Zaretskii Sept. 30, 2014, 2:36 a.m. UTC | #1
> 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.
  

Patch

diff --git a/gdb/NEWS b/gdb/NEWS
index 11326f1..50a7e95 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -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
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 026706a..d9a24a2 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -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.
diff --git a/gdb/inferior.c b/gdb/inferior.c
index 23da0c7..66401ab 100644
--- a/gdb/inferior.c
+++ b/gdb/inferior.c
@@ -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);
 }
diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c
index 59717ca..4d35ff0 100644
--- a/gdb/mi/mi-main.c
+++ b/gdb/mi/mi-main.c
@@ -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);

diff --git a/gdb/testsuite/gdb.mi/mi-exit-code.c b/gdb/testsuite/gdb.mi/mi-exit-code.c
new file mode 100644
index 0000000..df711a6
--- /dev/null
+++ b/gdb/testsuite/gdb.mi/mi-exit-code.c
@@ -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;
+}
diff --git a/gdb/testsuite/gdb.mi/mi-exit-code.exp b/gdb/testsuite/gdb.mi/mi-exit-code.exp
new file mode 100644
index 0000000..025879a
--- /dev/null
+++ b/gdb/testsuite/gdb.mi/mi-exit-code.exp
@@ -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