forked from Imagelibrary/binutils-gdb
* 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:
@@ -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
|
||||
|
||||
@@ -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. */
|
||||
|
||||
@@ -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 ...
|
||||
|
||||
33
gdb/testsuite/gdb.base/callexit.c
Normal file
33
gdb/testsuite/gdb.base/callexit.c
Normal 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;
|
||||
}
|
||||
90
gdb/testsuite/gdb.base/callexit.exp
Normal file
90
gdb/testsuite/gdb.base/callexit.exp
Normal 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
|
||||
Reference in New Issue
Block a user