diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6d5f19d04b..986a701c2f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2019-09-12 Philippe Waroquiers + + * NEWS: Announce that Ada task names are now shown at more places, + and between quotes (except in info task output). + * gdb/ada-tasks.c (task_to_str): New function. + (display_current_task_id): Call task_to_str. + (task_command_1): Likewise. + (print_ada_task_info): In non-mi mode, Properly align headers and data + when task-id length is > 9 (9 is the default for a 32 bits CORE_ADDR). + 2019-09-12 Rainer Orth * procfs.c (procfs_target::wait) : Get signal from diff --git a/gdb/NEWS b/gdb/NEWS index f382e887c0..d502f08984 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -29,6 +29,9 @@ * The RX port now supports XML target descriptions. +* GDB now shows the Ada task names at more places, e.g. in task switching + messages. + * Python API ** The gdb.Value type has a new method 'format_string' which returns a diff --git a/gdb/ada-tasks.c b/gdb/ada-tasks.c index 99458aadb2..34da786eb7 100644 --- a/gdb/ada-tasks.c +++ b/gdb/ada-tasks.c @@ -240,6 +240,18 @@ struct ada_tasks_inferior_data static const struct inferior_key ada_tasks_inferior_data_handle; +/* Return a string with TASKNO followed by the task name if TASK_INFO + contains a name. */ + +static std::string +task_to_str (int taskno, const ada_task_info *task_info) +{ + if (task_info->name[0] == '\0') + return string_printf ("%d", taskno); + else + return string_printf ("%d \"%s\"", taskno, task_info->name); +} + /* Return the ada-tasks module's data for the given program space (PSPACE). If none is found, add a zero'ed one now. @@ -1047,7 +1059,26 @@ print_ada_task_info (struct ui_out *uiout, ui_out_emit_table table_emitter (uiout, nb_columns, nb_tasks, "tasks"); uiout->table_header (1, ui_left, "current", ""); uiout->table_header (3, ui_right, "id", "ID"); - uiout->table_header (9, ui_right, "task-id", "TID"); + { + size_t tid_width = 9; + /* Grown below in case the largest entry is bigger. */ + + if (!uiout->is_mi_like_p ()) + { + for (taskno = 1; taskno <= data->task_list.size (); taskno++) + { + const struct ada_task_info *const task_info + = &data->task_list[taskno - 1]; + + gdb_assert (task_info != NULL); + + tid_width = std::max (tid_width, + 1 + strlen (phex_nz (task_info->task_id, + sizeof (CORE_ADDR)))); + } + } + uiout->table_header (tid_width, ui_right, "task-id", "TID"); + } /* The following column is provided in GDB/MI mode only because it is only really useful in that mode, and also because it allows us to keep the CLI output shorter and more compact. */ @@ -1129,10 +1160,12 @@ print_ada_task_info (struct ui_out *uiout, else uiout->field_string ("state", task_states[task_info->state]); - /* Finally, print the task name. */ + /* Finally, print the task name, without quotes around it, as mi like + is not expecting quotes, and in non mi-like no need for quotes + as there is a specific column for the name. */ uiout->field_string ("name", - task_info->name[0] != '\0' ? task_info->name - : _("")); + task_info->name[0] != '\0' ? task_info->name + : _("")); uiout->text ("\n"); } @@ -1166,7 +1199,7 @@ info_task (struct ui_out *uiout, const char *taskno_str, struct inferior *inf) /* Print the name of the task. */ if (task_info->name[0] != '\0') - printf_filtered (_("Name: %s\n"), task_info->name); + printf_filtered (_("Name: \"%s\"\n"), task_info->name); else printf_filtered (_("\n")); @@ -1187,7 +1220,7 @@ info_task (struct ui_out *uiout, const char *taskno_str, struct inferior *inf) printf_filtered (_("Parent: %d"), parent_taskno); if (parent->name[0] != '\0') - printf_filtered (" (%s)", parent->name); + printf_filtered (" (\"%s\")", parent->name); printf_filtered ("\n"); } else @@ -1220,7 +1253,7 @@ info_task (struct ui_out *uiout, const char *taskno_str, struct inferior *inf) ada_task_info *target_task_info = &data->task_list[target_taskno - 1]; if (target_task_info->name[0] != '\0') - printf_filtered (" (%s)", target_task_info->name); + printf_filtered (" (\"%s\")", target_task_info->name); } printf_filtered ("\n"); @@ -1255,7 +1288,14 @@ display_current_task_id (void) if (current_task == 0) printf_filtered (_("[Current task is unknown]\n")); else - printf_filtered (_("[Current task is %d]\n"), current_task); + { + struct ada_tasks_inferior_data *data + = get_ada_tasks_inferior_data (current_inferior ()); + struct ada_task_info *task_info = &data->task_list[current_task - 1]; + + printf_filtered (_("[Current task is %s]\n"), + task_to_str (current_task, task_info).c_str ()); + } } /* Parse and evaluate TIDSTR into a task id, and try to switch to @@ -1274,7 +1314,8 @@ task_command_1 (const char *taskno_str, int from_tty, struct inferior *inf) task_info = &data->task_list[taskno - 1]; if (!ada_task_is_alive (task_info)) - error (_("Cannot switch to task %d: Task is no longer running"), taskno); + error (_("Cannot switch to task %s: Task is no longer running"), + task_to_str (taskno, task_info).c_str ()); /* On some platforms, the thread list is not updated until the user performs a thread-related operation (by using the "info threads" @@ -1295,13 +1336,14 @@ task_command_1 (const char *taskno_str, int from_tty, struct inferior *inf) it's nicer for the user to just refuse to perform the task switch. */ thread_info *tp = find_thread_ptid (task_info->ptid); if (tp == NULL) - error (_("Unable to compute thread ID for task %d.\n" + error (_("Unable to compute thread ID for task %s.\n" "Cannot switch to this task."), - taskno); + task_to_str (taskno, task_info).c_str ()); switch_to_thread (tp); ada_find_printable_frame (get_selected_frame (NULL)); - printf_filtered (_("[Switching to task %d]\n"), taskno); + printf_filtered (_("[Switching to task %s]\n"), + task_to_str (taskno, task_info).c_str ()); print_stack_frame (get_selected_frame (NULL), frame_relative_level (get_selected_frame (NULL)), SRC_AND_LOC, 1); diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 96c0409197..4705fbc541 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,8 @@ +2019-09-12 Philippe Waroquiers + + * gdb.texinfo (Ada Tasks): Tell the task name is printed, update + examples. + 2019-09-10 Tom Tromey * gdb.texinfo (Index Files): Update Ada text. diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 79824a0226..eee0c9d4dd 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -17751,10 +17751,10 @@ the following example: * 2 807c468 1 15 Runnable task_1 (@value{GDBP}) info task 2 Ada Task: 0x807c468 -Name: task_1 +Name: "task_1" Thread: 0 LWP: 0x1fac -Parent: 1 (main_task) +Parent: 1 ("main_task") Base Priority: 15 State: Runnable @end smallexample @@ -17762,7 +17762,7 @@ State: Runnable @item task @kindex task@r{ (Ada)} @cindex current Ada task ID -This command prints the ID of the current task. +This command prints the ID and name of the current task. @smallexample @iftex @@ -17771,9 +17771,9 @@ This command prints the ID of the current task. (@value{GDBP}) info tasks ID TID P-ID Pri State Name 1 8077870 0 15 Child Activation Wait main_task -* 2 807c458 1 15 Runnable t +* 2 807c458 1 15 Runnable some_task (@value{GDBP}) task -[Current task is 2] +[Current task is 2 "some_task"] @end smallexample @item task @var{taskno} @@ -17789,9 +17789,9 @@ from the current task to the given task. (@value{GDBP}) info tasks ID TID P-ID Pri State Name 1 8077870 0 15 Child Activation Wait main_task -* 2 807c458 1 15 Runnable t +* 2 807c458 1 15 Runnable some_task (@value{GDBP}) task 1 -[Switching to task 1] +[Switching to task 1 "main_task"] #0 0x8067726 in pthread_cond_wait () (@value{GDBP}) bt #0 0x8067726 in pthread_cond_wait () diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index a51d22ce22..bf3fcc7d84 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2019-09-12 Philippe Waroquiers + + * gdb.ada/rdv_wait.exp: Update to new task names. + * gdb.base/task_switch_in_core.exp: Likewise. + * gdb.base/info_sources_base.c: Likewise. + 2019-09-10 Tom Tromey * boards/cc-with-tweaks.exp: Set GNATMAKE_FOR_TARGET. diff --git a/gdb/testsuite/gdb.ada/rdv_wait.exp b/gdb/testsuite/gdb.ada/rdv_wait.exp index c0c4e29f5f..fe6aec3bcd 100644 --- a/gdb/testsuite/gdb.ada/rdv_wait.exp +++ b/gdb/testsuite/gdb.ada/rdv_wait.exp @@ -31,5 +31,5 @@ runto "break_me" # Switch to task 2, and verify that GDB is able to unwind all the way # to foo.T. gdb_test "task 2" \ - [join {"\\\[Switching to task 2\\\].*" \ + [join {"\\\[Switching to task 2 \"mit\"\\\].*" \ ".*foo\\.t \\(.*\\).*foo\\.adb:.*"} ""] diff --git a/gdb/testsuite/gdb.ada/task_switch_in_core.exp b/gdb/testsuite/gdb.ada/task_switch_in_core.exp index 4c482834bc..fb9aef2840 100644 --- a/gdb/testsuite/gdb.ada/task_switch_in_core.exp +++ b/gdb/testsuite/gdb.ada/task_switch_in_core.exp @@ -71,7 +71,7 @@ gdb_test "info tasks" \ # 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\\\].*" + "\\\[Switching to task 2 \"my_t\"\\\].*" gdb_test "info tasks" \ [multi_line "\\s+ID\\s+TID\\s+P-ID\\s+Pri\\s+State\\s+Name" \