Avoid crash in print_ada_task_info
authorTom Tromey <tromey@adacore.com>
Thu, 21 Nov 2019 16:05:10 +0000 (09:05 -0700)
committerTom Tromey <tromey@adacore.com>
Fri, 22 Nov 2019 22:11:57 +0000 (15:11 -0700)
In MI mode, print_ada_task_info can crash in find_thread_ptid when
trying to print an Ada task that is no longer alive.  This patch
avoids the problem by checking for this case.

Because this is Ada-specific, and because Joel approved it internally,
I am checking it in.

gdb/ChangeLog
2019-11-22  Tom Tromey  <tromey@adacore.com>

* ada-tasks.c (ada_task_is_alive): Make parameter const.
(print_ada_task_info): Don't try to fetch thread id if task is not
alive.

gdb/gdbserver/ChangeLog
2019-11-22  Tom Tromey  <tromey@adacore.com>

* gdb.ada/tasks.exp: Add -ada-task-info regression test.
* gdb.ada/tasks/foo.adb: Add another stopping location.

Change-Id: If25eae6507eebb7537eb8adbcbaa1fc1eec88f5c

gdb/ChangeLog
gdb/ada-tasks.c
gdb/gdbserver/ChangeLog
gdb/testsuite/gdb.ada/tasks.exp
gdb/testsuite/gdb.ada/tasks/foo.adb

index 5dd8d4281436a9a634aa87f4de3e357187042753..cd26997619c650d0f045bc2d84da15abe302ccc9 100644 (file)
@@ -1,3 +1,9 @@
+2019-11-22  Tom Tromey  <tromey@adacore.com>
+
+       * ada-tasks.c (ada_task_is_alive): Make parameter const.
+       (print_ada_task_info): Don't try to fetch thread id if task is not
+       alive.
+
 2019-11-22  Christian Biesinger  <cbiesinger@google.com>
 
        * ada-exp.y: Update.
index 110a710a5ffd023a15071fce596143b138204a3f..67aa0c798890aae65c5bbada9635f157ac040681 100644 (file)
@@ -347,7 +347,7 @@ valid_task_id (int task_num)
    task state.  */
 
 static int
-ada_task_is_alive (struct ada_task_info *task_info)
+ada_task_is_alive (const struct ada_task_info *task_info)
 {
   return (task_info->state != Terminated);
 }
@@ -1127,14 +1127,17 @@ print_ada_task_info (struct ui_out *uiout,
       /* Print the associated Thread ID.  */
       if (uiout->is_mi_like_p ())
         {
-         thread_info *thread = find_thread_ptid (task_info->ptid);
+         thread_info *thread = (ada_task_is_alive (task_info)
+                                ? find_thread_ptid (task_info->ptid)
+                                : nullptr);
 
          if (thread != NULL)
            uiout->field_signed ("thread-id", thread->global_num);
          else
-           /* This should never happen unless there is a bug somewhere,
-              but be resilient when that happens.  */
-           uiout->field_skip ("thread-id");
+           {
+             /* This can happen if the thread is no longer alive.  */
+             uiout->field_skip ("thread-id");
+           }
        }
 
       /* Print the ID of the parent task.  */
index a5da6b584deab36ea1614d5e24e45be828cbfb91..02414385b796bf4c6bb7db619ef15d2e90addbda 100644 (file)
@@ -1,3 +1,8 @@
+2019-11-22  Tom Tromey  <tromey@adacore.com>
+
+       * gdb.ada/tasks.exp: Add -ada-task-info regression test.
+       * gdb.ada/tasks/foo.adb: Add another stopping location.
+
 2019-11-20  Luis Machado  <luis.machado@linaro.org>
 
        * linux-aarch64-low.c (is_sve_tdesc): Check against target feature
index 46a53fe76c42519b00d52958e20a72d79727d3de..021e902f7b00cc7f34dd44bf8c54a9cf867ae14e 100644 (file)
@@ -82,4 +82,10 @@ gdb_test "info tasks" \
 # Now, resume the execution and make sure that GDB does not stop when
 # task 4 hits the breakpoint. Continuing thus results in our program
 # running to completion.
-gdb_continue_to_end "" continue 1
+set bp_location [gdb_get_line_number "STOP_HERE_2" ${testdir}/foo.adb]
+gdb_breakpoint foo.adb:$bp_location
+gdb_continue_to_breakpoint second ".*foo.adb:$bp_location.*null; -- STOP_HERE_2"
+
+# A regression test for a crash caused by trying to find the thread
+# for a terminated task.
+gdb_test "interpreter-exec mi \"-ada-task-info\"" ".*"
index f95fed4f4ca91414ec6eee3516b9d06f5f1dc138..9fc43b07c94c99cadd8dd0ef458bace1fdcc79ae 100644 (file)
@@ -65,4 +65,7 @@ begin
    for J in Task_List'Range loop
       Task_List (J).Finalize;
    end loop;
+
+   null; -- STOP_HERE_2
+
 end Foo;
This page took 0.03799 seconds and 4 git commands to generate.