This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[RFA]: ada-tasks.c: display ravenscar task name
- From: Tristan Gingold <gingold at adacore dot com>
- To: "gdb-patches at sourceware dot org ml" <gdb-patches at sourceware dot org>
- Date: Tue, 4 Oct 2011 12:32:55 +0200
- Subject: [RFA]: ada-tasks.c: display ravenscar task name
Hi,
currently ravenscar tasks are displayed by 'info tasks' as 'Ravenscar task' which is not very useful to distinct tasks.
Although these tasks have no name stored in the ATCB, the symbol for the ACTB uses the task name, so it is possible to recover the name of the task from the ATCB symbol.
This patch implements this idea.
Ok for trunk ?
I tested it on AdaCore internal test suite, and sanity-check that gdb still compiles.
Tristan.
2011-10-04 Tristan Gingold <gingold@adacore.com>
* ada-tasks.c (read_atcb): Make ravenscar_task_name static.
Extract the ravenscar task name from the symbol for the atcb.
diff --git a/gdb/ada-tasks.c b/gdb/ada-tasks.c
index 2673fed..ee6685d 100644
--- a/gdb/ada-tasks.c
+++ b/gdb/ada-tasks.c
@@ -591,7 +591,7 @@ read_atcb (CORE_ADDR task_id, struct ada_task_info *task_info)
struct value *entry_calls_value;
struct value *entry_calls_value_element;
int called_task_fieldno = -1;
- const char ravenscar_task_name[] = "Ravenscar task";
+ static const char ravenscar_task_name[] = "Ravenscar task";
const struct ada_tasks_pspace_data *pspace_data
= get_ada_tasks_pspace_data (current_program_space);
@@ -629,7 +629,31 @@ read_atcb (CORE_ADDR task_id, struct ada_task_info *task_info)
pspace_data->atcb_fieldno.image),
sizeof (task_info->name) - 1);
else
- strcpy (task_info->name, ravenscar_task_name);
+ {
+ struct minimal_symbol *msym;
+
+ msym = lookup_minimal_symbol_by_pc (task_id);
+ if (msym)
+ {
+ const char *full_name = SYMBOL_LINKAGE_NAME (msym);
+ const char *task_name = full_name;
+ const char *p;
+
+ /* Strip the prefix. */
+ for (p = full_name; *p; p++)
+ if (p[0] == '_' && p[1] == '_')
+ task_name = p + 2;
+
+ /* Copy the task name. */
+ strncpy (task_info->name, task_name, sizeof (task_info->name));
+ task_info->name[sizeof (task_info->name) - 1] = 0;
+ }
+ else
+ {
+ /* No symbol found. Use a default name. */
+ strcpy (task_info->name, ravenscar_task_name);
+ }
+ }
}
else
{