diff options
author | Tom Tromey <tromey@adacore.com> | 2019-11-21 09:05:10 -0700 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2019-11-22 15:11:57 -0700 |
commit | c83d8d32c9b3379a39c434fcaa9f304b6e4432ca (patch) | |
tree | 742c0a8d8eb8628814acb573f5ee605a8c8b216e /gdb/ada-tasks.c | |
parent | 987012b89bce7f6385ed88585547f852a8005a3f (diff) | |
download | gdb-c83d8d32c9b3379a39c434fcaa9f304b6e4432ca.zip gdb-c83d8d32c9b3379a39c434fcaa9f304b6e4432ca.tar.gz gdb-c83d8d32c9b3379a39c434fcaa9f304b6e4432ca.tar.bz2 |
Avoid crash in print_ada_task_info
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
Diffstat (limited to 'gdb/ada-tasks.c')
-rw-r--r-- | gdb/ada-tasks.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/gdb/ada-tasks.c b/gdb/ada-tasks.c index 110a710..67aa0c7 100644 --- a/gdb/ada-tasks.c +++ b/gdb/ada-tasks.c @@ -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. */ |