This is the mail archive of the gdb@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RFC: GDB as a loader 2/3: return child result


Hi all,

The attached patch implements a new option --return-child-result. This
option causes GDB to return the return value of the last child
(inferior) program to run. The patch assumes that the batch-silent patch
has already been applied.

Note that 'quit <expr>' still works as expected. Also, any exit through
a mechanism other than quit_force (i.e. errors) gives the same exit code
as it did before. Batch mode has been adjusted to exit through
quit_force in order to ensure it give the right result.

I am not sure that this has been implemented in the best way. The
declaration of extern variables probably ought to be moved to a header
file somewhere, but I'm not sure which is best. It has also been
suggested that it ought to use the value stored in the existing
$_exitcode convenience variable.

Thanks

Andrew Stubbs



2005-10-18  Andrew Stubbs  <andrew.stubbs@st.com>

	* infrun.c (print_stop_reason): Set return_child_result_value on exit.
	* main.c (return_child_result): New variable.
	(return_child_result_value): Likewise.
	(captured_main): Add option --return-child-result.
	Replace call to target_detach and exit (in batch mode) with quit_force.
	(print_gdb_help): Add option --return-child-result.
	* top.c (quit_force): Return child result if appropriate.


Index: src/gdb/infrun.c
===================================================================
--- src.orig/gdb/infrun.c	2005-09-29 21:41:27.000000000 +0100
+++ src/gdb/infrun.c	2005-10-17 18:00:23.000000000 +0100
@@ -2931,6 +2931,11 @@ print_stop_reason (enum inferior_stop_re
 	       async_reason_lookup (EXEC_ASYNC_EXITED_NORMALLY));
 	  ui_out_text (uiout, "\nProgram exited normally.\n");
 	}
+      {
+	/* Support the --return-child-result option.  */
+	extern int return_child_result_value;
+	return_child_result_value = stop_info;
+      }
       break;
     case SIGNAL_RECEIVED:
       /* Signal received. The signal table tells us to print about
Index: src/gdb/main.c
===================================================================
--- src.orig/gdb/main.c	2005-10-17 17:44:35.000000000 +0100
+++ src/gdb/main.c	2005-10-17 18:19:31.000000000 +0100
@@ -76,6 +76,12 @@ struct ui_file *gdb_stdtargerr;
 /* Support for the --batch-silent option.  */
 int batch_silent = 0;
 
+/* Support for --return-child-result option.
+   Set the default to -1 to return error in the case
+   that the program does not run or does not complete.  */
+int return_child_result = 0;
+int return_child_result_value = -1;
+
 /* Whether to enable writing into executable and core files */
 extern int write_files;
 
@@ -303,6 +309,7 @@ captured_main (void *data)
       {"write", no_argument, &write_files, 1},
       {"args", no_argument, &set_args, 1},
      {"l", required_argument, 0, 'l'},
+      {"return-child-result", no_argument, &return_child_result, 1},
       {0, no_argument, 0, 0}
     };
 
@@ -735,15 +742,8 @@ extern int gdbtk_test (char *);
 
   if (batch)
     {
-      if (attach_flag)
-	/* Either there was a problem executing the command in the
-	   batch file aborted early, or the batch file forgot to do an
-	   explicit detach.  Explicitly detach the inferior ensuring
-	   that there are no zombies.  */
-	target_detach (NULL, 0);
-      
       /* We have hit the end of the batch file.  */
-      exit (0);
+      quit_force (NULL, 0);
     }
 
   /* Do any host- or target-specific hacks.  This is used for i960 targets
@@ -843,6 +843,8 @@ Options:\n\n\
   -b BAUDRATE        Set serial port baud rate used for remote debugging.\n\
   --batch            Exit after processing options.\n\
   --batch-silent     As for --batch, but suppress all gdb stdout output.\n\
+  --return-child-result\n\
+                     GDB exit code will be the child's exit code.\n\
   --cd=DIR           Change current directory to DIR.\n\
   --command=FILE     Execute GDB commands from FILE.\n\
   --core=COREFILE    Analyze the core dump COREFILE.\n\
Index: src/gdb/top.c
===================================================================
--- src.orig/gdb/top.c	2005-07-04 14:29:12.000000000 +0100
+++ src/gdb/top.c	2005-10-17 18:00:23.000000000 +0100
@@ -1177,6 +1177,7 @@ quit_force (char *args, int from_tty)
 {
   int exit_code = 0;
   struct qt_args qt;
+  extern int return_child_result, return_child_result_value;
 
   /* An optional expression may be used to cause gdb to terminate with the 
      value of that expression. */
@@ -1186,6 +1187,8 @@ quit_force (char *args, int from_tty)
 
       exit_code = (int) value_as_long (val);
     }
+  else if (return_child_result)
+    exit_code = return_child_result_value;
 
   qt.args = args;
   qt.from_tty = from_tty;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]