Browse Source
The reasons for not supporting task switching when debugging core files
appear to now mostly be OBE. In particular, on GNU/Linux, the thread
layer is now able to retrieve the same thread info as in the live
process. So, this patch is mostly about just removing the guard
that limited the use of task switching to live processes.
gdb/ChangeLog:
* ada-tasks.c (read_atcb): Properly set task_info->ptid
when !target_has_execution as well.
(task_command): Remove error when !target_has_execution.
gdb/testsuite/ChangeLog:
* gdb.ada/task_switch_in_core: New testcase.
gdb-8.1-branch
5 changed files with 148 additions and 29 deletions
@ -0,0 +1,80 @@ |
|||
# 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" |
|||
@ -0,0 +1,53 @@ |
|||
-- 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; |
|||
Loading…
Reference in new issue