* infcall.c (call_function_by_hand): Handle inferior exit.

* gdb.base/callexit.exp: New file.
	* gdb.base/callexit.c: New file.
This commit is contained in:
Doug Evans
2008-11-12 00:39:28 +00:00
parent 6da1d149f3
commit de04a24895
5 changed files with 142 additions and 0 deletions

View File

@@ -1,3 +1,7 @@
2008-11-11 Doug Evans <dje@google.com>
* infcall.c (call_function_by_hand): Handle inferior exit.
2008-11-11 Thiago Jung Bauermann <bauerman@br.ibm.com>
* remote-sim.c (gdbsim_create_inferior, gdbsim_mourn_inferior): Add

View File

@@ -699,6 +699,16 @@ call_function_by_hand (struct value *function, int nargs, struct value **args)
discard_cleanups (old_cleanups);
}
if (! target_has_execution)
{
/* If we try to restore the inferior status (via the cleanup),
we'll crash as the inferior is no longer running. */
discard_cleanups (inf_status_cleanup);
discard_inferior_status (inf_status);
error (_("\
The program being debugged exited while in a function called from GDB."));
}
if (stopped_by_random_signal || !stop_stack_dummy)
{
/* Find the name of the function we're about to complain about. */

View File

@@ -1,3 +1,8 @@
2008-11-11 Doug Evans <dje@google.com>
* gdb.base/callexit.exp: New file.
* gdb.base/callexit.c: New file.
2008-11-10 Doug Evans <dje@google.com>
* lib/gdb.exp (GDBFLAGS): Move -nx ...

View File

@@ -0,0 +1,33 @@
/* This testcase is part of GDB, the GNU debugger.
Copyright 2008 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/>. */
/* Support program for testing gdb's ability to handle an
inferior function call that terminates the program. */
#include <stdlib.h>
void
callexit ()
{
exit (0);
}
int
main ()
{
return 0;
}

View File

@@ -0,0 +1,90 @@
# Copyright 2008 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/>.
if $tracelevel then {
strace $tracelevel
}
set prms_id 0
set bug_id 0
set testfile "callexit"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
untested callexit.exp
return -1
}
# Some targets can't do function calls, so don't even bother with this
# test.
if [target_info exists gdb,cannot_call_functions] {
setup_xfail "*-*-*" 2416
fail "This target can not call functions"
continue
}
# Set the current language to C. This counts as a test. If it
# fails, then we skip the other tests.
proc set_lang_c {} {
global gdb_prompt
send_gdb "set language c\n"
gdb_expect {
-re ".*$gdb_prompt $" {}
timeout { fail "set language c (timeout)" ; return 0; }
}
send_gdb "show language\n"
gdb_expect {
-re ".* source language is \"c\".*$gdb_prompt $" {
pass "set language to \"c\""
return 1
}
-re ".*$gdb_prompt $" {
fail "setting language to \"c\""
return 0
}
timeout {
fail "can't show language (timeout)"
return 0
}
}
}
# Start with a fresh gdb.
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
if { ![set_lang_c] } {
gdb_suppress_tests;
} else {
if { ![runto_main] } {
gdb_suppress_tests;
}
}
# Call function (causing the program to exit), and see if gdb handles
# it properly.
gdb_test "call callexit()" \
"The program being debugged exited.*" \
"inferior function call terminated program"
return 0