+2017-12-14 Joel Brobecker <brobecker@adacore.com>
+
+ * ada-tasks.c (read_atcb): Properly set task_info->ptid
+ when !target_has_execution as well.
+ (task_command): Remove error when !target_has_execution.
+
2017-12-13 Simon Marchi <simon.marchi@ericsson.com>
* location.h (string_to_event_location): Add match_type
= value_as_long (value_field (common_value,
pspace_data->atcb_fieldno.base_cpu));
- /* And finally, compute the task ptid. Note that there are situations
- where this cannot be determined:
- - The task is no longer alive - the ptid is irrelevant;
- - We are debugging a core file - the thread is not always
- completely preserved for us to link back a task to its
- underlying thread. Since we do not support task switching
- when debugging core files anyway, we don't need to compute
- that task ptid.
- In either case, we don't need that ptid, and it is just good enough
- to set it to null_ptid. */
-
- if (target_has_execution && ada_task_is_alive (task_info))
+ /* And finally, compute the task ptid. Note that there is not point
+ in computing it if the task is no longer alive, in which case
+ it is good enough to set its ptid to the null_ptid. */
+ if (ada_task_is_alive (task_info))
task_info->ptid = ptid_from_atcb_common (common_value);
else
task_info->ptid = null_ptid;
if (taskno_str == NULL || taskno_str[0] == '\0')
display_current_task_id ();
else
- {
- /* Task switching in core files doesn't work, either because:
- 1. Thread support is not implemented with core files
- 2. Thread support is implemented, but the thread IDs created
- after having read the core file are not the same as the ones
- that were used during the program life, before the crash.
- As a consequence, there is no longer a way for the debugger
- to find the associated thead ID of any given Ada task.
- So, instead of attempting a task switch without giving the user
- any clue as to what might have happened, just error-out with
- a message explaining that this feature is not supported. */
- if (!target_has_execution)
- error (_("\
-Task switching not supported when debugging from core files\n\
-(use thread support instead)"));
- task_command_1 (taskno_str, from_tty, current_inferior ());
- }
+ task_command_1 (taskno_str, from_tty, current_inferior ());
}
/* Indicate that the given inferior's task list may have changed,
+2017-12-14 Joel Brobecker <brobecker@adacore.com>
+
+ * gdb.ada/task_switch_in_core: New testcase.
+
2017-12-13 Simon Marchi <simon.marchi@ericsson.com>
* gdb.python/py-breakpoint.c (foo_ns::multiply): New function.
--- /dev/null
+# Copyright 2017 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 "ada.exp"
+
+standard_ada_testfile crash
+
+if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug]] != "" } {
+ return -1
+}
+
+clean_restart ${testfile}
+
+# Run the program to a certain point, and then use the gcore command
+# to generate a core file. The only objective of this part of this
+# testcase is to generate this core file, so we can then exercise
+# task-switching when debugging from core files.
+
+if { ![runto request_for_crash ]} then {
+ untested "couldn't run to Request_For_Crash"
+ return -1
+}
+
+set corefile [standard_output_file crash.gcore]
+set core_supported [gdb_gcore_cmd "$corefile" "save a corefile"]
+if {!$core_supported} {
+ return -1
+}
+
+# Now taht the core file has been created, we can start the real
+# part of this testcase, which is to debug using that core file.
+# Restart GDB and load that core file.
+
+clean_restart ${testfile}
+
+set core_loaded [gdb_core_cmd "$corefile" "re-load generated corefile"]
+if { $core_loaded == -1 } {
+ # No use proceeding from here.
+ return
+}
+
+# First, switch to task 1.
+
+gdb_test "task 1" \
+ "crash\\.request_for_crash \\(\\) at .*crash\\.adb:$decimal.*"
+
+
+gdb_test "info tasks" \
+ [multi_line "\\s+ID\\s+TID\\s+P-ID\\s+Pri\\s+State\\s+Name" \
+ "\\*\\s+1\\s+.*main_task" \
+ "\\s+2.*my_t"] \
+ "info tasks after switching to task 1"
+
+# Switch to task 2. Unlike in the case where we tested the switch to
+# task 1, don't check the location where the debugger says the program
+# is, as this might depend on the runtime, and in particular it might
+# depend on whether the runtime is built with debugging information
+# or not. Just check that we get the "switching to task" message, and
+# we will verify right after with an additional test that the current
+# task is now task 2.
+gdb_test "task 2" \
+ "\\\[Switching to task 2\\\].*"
+
+gdb_test "info tasks" \
+ [multi_line "\\s+ID\\s+TID\\s+P-ID\\s+Pri\\s+State\\s+Name" \
+ "\\s+1\\s+.*main_task" \
+ "\\*\\s+2.*my_t"] \
+ "info tasks after switching to task 2"
--- /dev/null
+-- Copyright 2017 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/>.
+
+with Ada.Text_IO; use Ada.Text_IO;
+
+procedure Crash is
+
+ procedure Request_For_Crash is
+ begin
+ null; -- Just an anchor for the debugger...
+ end Request_For_Crash;
+
+ task type T is
+ entry Done;
+ end T;
+
+ task body T is
+ begin
+ accept Done do
+ null;
+ end Done;
+ Put_Line ("Task T: Rendez-vous completed.");
+ end T;
+
+ My_T : T;
+
+begin
+
+ -- Give some time for the task to be created, and start its execution,
+ -- so that it reaches the accept statement.
+ delay 0.01;
+
+ Request_For_Crash;
+
+ delay 0.01;
+ Put_Line ("*** We didn't crash !?!");
+
+ -- Complete the rendez-vous with our task, so it can complete.
+ My_T.Done;
+
+end Crash;