This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH] Add set/show display-linkname command
- From: Michael Eager <eager at eagerm dot com>
- To: gdb-patches at sourceware dot org
- Date: Thu, 21 Mar 2013 12:04:34 -0700
- Subject: Re: [PATCH] Add set/show display-linkname command
- References: <5147BD81 dot 6000702 at eagercon dot com>
On 03/18/2013 06:21 PM, Michael Eager wrote:
It's sometimes useful to know what the linkage name is for a function,
either for C++ programs or on any target which can decorate symbols in
various ways, such as optionally prepending an underscore.
This patch adds two commands: "show display-linkname" and "set display-linkname".
When set, the linkname is displayed whenever the function is displayed in
in breakpoint command or when the frame is displayed.
The following shows a small C++ program hitting a breakpoint and running
a backtrace, with and without the linkage name.
$ gdb tpp
GNU gdb (GDB) 7.6.50.20130313-cvs
...
(gdb) show display-linkname
Whether to display linkage name for functions is off.
(gdb) b foo
Breakpoint 1 at 0x400a0c: file t.cpp, line 6.
(gdb) run
Starting program: /tmp/tpp
Breakpoint 1, foo (msg=...) at t.cpp:6
6 cout << msg;
(gdb) bt
#0 foo (msg=...) at t.cpp:6
#1 0x0000000000400a55 in main () at t.cpp:11
(gdb) set display-linkname on
(gdb) show display-linkname
Whether to display linkage name for functions is on.
(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /tmp/tpp
Breakpoint 1, foo [_Z3fooSs] (msg=...) at t.cpp:6
6 cout << msg;
(gdb) bt
#0 foo [_Z3fooSs] (msg=...) at t.cpp:6
#1 0x0000000000400a55 in main [main] () at t.cpp:11
(gdb) quit
ChangeLog:
* 2013-03-18 Michael Eager <eager@eagercon.com>
* ada-lang.c (is_known_support_routine): Add linkname to find_frame_funname() call.
* defs.h (build_address_symbolic): Add linkname arg.
* disasm.c (dump_insns): Add linkname to find_frame_funname() call.
* printcmd.c (top.h): Include.
(MAX_LINKNAME_LEN): Define as 20.
(print_address_symbolic): Add linkname to build_address_symbolic() call, print
linkname if display-linkname set.
(build_address_symbolic): Add linkname arg, set if different from symbol name.
* stack.c (top.h): Include.
(MAX_LINKNAME_LEN): Define as 20.
(find_frame_funname): Add linkname arg, set if different from symbol name.
(print_frame): Add linkname to find_frame_funname() call, print linkname if
display-linkname set.
* stack.h (find_frame_funname): Add linkname arg.
* top.c (disp_linkname): Define.
(show_disp_linkname): New.
(init_main): Add 'display-linkname' set/show command.
* top.h (disp_linkname): Declare.
* python/py-frame.c(frapy_name): Add linkname to find_frame_funname() call.
Updated patch which fixes garbled output.
--
Michael Eager eager@eagercon.com
1960 Park Blvd., Palo Alto, CA 94306 650-325-8077
? .dwarf2read.c.swp
? common/signals.c-annotate
Index: ada-lang.c
===================================================================
RCS file: /cvs/src/src/gdb/ada-lang.c,v
retrieving revision 1.397
diff -u -p -r1.397 ada-lang.c
--- ada-lang.c 13 Mar 2013 18:34:53 -0000 1.397
+++ ada-lang.c 21 Mar 2013 19:00:38 -0000
@@ -11107,6 +11107,7 @@ is_known_support_routine (struct frame_i
{
struct symtab_and_line sal;
const char *func_name;
+ const char *linkname;
enum language func_lang;
int i;
const char *fullname;
@@ -11145,7 +11146,7 @@ is_known_support_routine (struct frame_i
/* Check whether the function is a GNAT-generated entity. */
- find_frame_funname (frame, &func_name, &func_lang, NULL);
+ find_frame_funname (frame, &func_name, &linkname, &func_lang, NULL);
if (func_name == NULL)
return 1;
@@ -11212,9 +11213,10 @@ ada_unhandled_exception_name_addr_from_r
while (fi != NULL)
{
const char *func_name;
+ const char *linkname;
enum language func_lang;
- find_frame_funname (fi, &func_name, &func_lang, NULL);
+ find_frame_funname (fi, &func_name, &linkname, &func_lang, NULL);
if (func_name != NULL
&& strcmp (func_name, data->exception_info->catch_exception_sym) == 0)
break; /* We found the frame we were looking for... */
Index: defs.h
===================================================================
RCS file: /cvs/src/src/gdb/defs.h,v
retrieving revision 1.329
diff -u -p -r1.329 defs.h
--- defs.h 4 Feb 2013 12:57:44 -0000 1.329
+++ defs.h 21 Mar 2013 19:00:38 -0000
@@ -335,6 +335,7 @@ extern int build_address_symbolic (struc
CORE_ADDR addr,
int do_demangle,
char **name,
+ char **linkname,
int *offset,
char **filename,
int *line,
Index: disasm.c
===================================================================
RCS file: /cvs/src/src/gdb/disasm.c,v
retrieving revision 1.51
diff -u -p -r1.51 disasm.c
--- disasm.c 11 Mar 2013 08:53:17 -0000 1.51
+++ disasm.c 21 Mar 2013 19:00:38 -0000
@@ -112,6 +112,7 @@ dump_insns (struct gdbarch *gdbarch, str
{
char *filename = NULL;
char *name = NULL;
+ char *linkname = NULL;
QUIT;
if (how_many >= 0)
@@ -127,8 +128,8 @@ dump_insns (struct gdbarch *gdbarch, str
ui_out_text (uiout, pc_prefix (pc));
ui_out_field_core_addr (uiout, "address", gdbarch, pc);
- if (!build_address_symbolic (gdbarch, pc, 0, &name, &offset, &filename,
- &line, &unmapped))
+ if (!build_address_symbolic (gdbarch, pc, 0, &name, &linkname, &offset,
+ &filename, &line, &unmapped))
{
/* We don't care now about line, filename and
unmapped. But we might in the future. */
Index: printcmd.c
===================================================================
RCS file: /cvs/src/src/gdb/printcmd.c,v
retrieving revision 1.225
diff -u -p -r1.225 printcmd.c
--- printcmd.c 13 Mar 2013 18:34:54 -0000 1.225
+++ printcmd.c 21 Mar 2013 19:00:38 -0000
@@ -51,11 +51,15 @@
#include "cli/cli-utils.h"
#include "format.h"
#include "source.h"
+#include "top.h"
#ifdef TUI
#include "tui/tui.h" /* For tui_active et al. */
#endif
+/* Maximum length of linkname to print. */
+#define MAX_LINKNAME_LEN 20
+
struct format_data
{
int count;
@@ -569,17 +573,18 @@ print_address_symbolic (struct gdbarch *
int do_demangle, char *leadin)
{
char *name = NULL;
+ char *linkname = NULL;
char *filename = NULL;
int unmapped = 0;
int offset = 0;
int line = 0;
- /* Throw away both name and filename. */
+ /* Throw away both name, linkname, and filename. */
struct cleanup *cleanup_chain = make_cleanup (free_current_contents, &name);
make_cleanup (free_current_contents, &filename);
- if (build_address_symbolic (gdbarch, addr, do_demangle, &name, &offset,
- &filename, &line, &unmapped))
+ if (build_address_symbolic (gdbarch, addr, do_demangle, &name, &linkname,
+ &offset, &filename, &line, &unmapped))
{
do_cleanups (cleanup_chain);
return 0;
@@ -591,6 +596,24 @@ print_address_symbolic (struct gdbarch *
else
fputs_filtered ("<", stream);
fputs_filtered (name, stream);
+
+ /* Print linkage name after source name if requested. */
+ if (disp_linkname && linkname)
+ {
+ char *lname = linkname;
+
+ if (strlen (lname) > MAX_LINKNAME_LEN)
+ {
+ lname = alloca (MAX_LINKNAME_LEN + 4);
+ strncpy (lname, linkname, MAX_LINKNAME_LEN);
+ lname[MAX_LINKNAME_LEN] = '\0';
+ strcat (lname, "...");
+ }
+ fputs_filtered (" [", stream);
+ fputs_filtered (lname, stream);
+ fputs_filtered ("]", stream);
+ }
+
if (offset != 0)
fprintf_filtered (stream, "+%u", (unsigned int) offset);
@@ -623,6 +646,7 @@ build_address_symbolic (struct gdbarch *
CORE_ADDR addr, /* IN */
int do_demangle, /* IN */
char **name, /* OUT */
+ char **linkname, /* OUT */
int *offset, /* OUT */
char **filename, /* OUT */
int *line, /* OUT */
@@ -637,6 +661,9 @@ build_address_symbolic (struct gdbarch *
/* Let's say it is mapped (not unmapped). */
*unmapped = 0;
+ /* Let's say the link name is the same as the symbol name. */
+ *linkname = 0;
+
/* Determine if the address is in an overlay, and whether it is
mapped. */
if (overlay_debugging)
@@ -729,6 +756,12 @@ build_address_symbolic (struct gdbarch *
*line = sal.line;
}
}
+
+ /* If we have both symbol names and they are different, let caller know. */
+ if (msymbol && symbol
+ && strcmp (SYMBOL_LINKAGE_NAME (msymbol), SYMBOL_LINKAGE_NAME (symbol)))
+ *linkname = xstrdup (SYMBOL_LINKAGE_NAME (msymbol));
+
return 0;
}
Index: stack.c
===================================================================
RCS file: /cvs/src/src/gdb/stack.c,v
retrieving revision 1.267
diff -u -p -r1.267 stack.c
--- stack.c 7 Mar 2013 21:57:30 -0000 1.267
+++ stack.c 21 Mar 2013 19:00:38 -0000
@@ -54,6 +54,10 @@
#include "psymtab.h"
#include "symfile.h"
+#include "top.h"
+
+/* Maximum length of linkname to print. */
+#define MAX_LINKNAME_LEN 20
void (*deprecated_selected_frame_level_changed_hook) (int);
@@ -1006,11 +1010,13 @@ get_last_displayed_sal (struct symtab_an
void
find_frame_funname (struct frame_info *frame, const char **funname,
- enum language *funlang, struct symbol **funcp)
+ const char **linkname, enum language *funlang,
+ struct symbol **funcp)
{
struct symbol *func;
*funname = NULL;
+ *linkname = NULL;
*funlang = language_unknown;
if (funcp)
*funcp = NULL;
@@ -1044,6 +1050,10 @@ find_frame_funname (struct frame_info *f
msymbol
= lookup_minimal_symbol_by_pc (get_frame_address_in_block (frame));
+ if (msymbol
+ && strcmp (SYMBOL_LINKAGE_NAME (msymbol), SYMBOL_LINKAGE_NAME (func)))
+ *linkname = SYMBOL_LINKAGE_NAME (msymbol);
+
if (msymbol != NULL
&& (SYMBOL_VALUE_ADDRESS (msymbol)
> BLOCK_START (SYMBOL_BLOCK_VALUE (func))))
@@ -1102,6 +1112,7 @@ print_frame (struct frame_info *frame, i
struct gdbarch *gdbarch = get_frame_arch (frame);
struct ui_out *uiout = current_uiout;
const char *funname = NULL;
+ const char *linkname = NULL;
enum language funlang = language_unknown;
struct ui_file *stb;
struct cleanup *old_chain, *list_chain;
@@ -1115,7 +1126,7 @@ print_frame (struct frame_info *frame, i
stb = mem_fileopen ();
old_chain = make_cleanup_ui_file_delete (stb);
- find_frame_funname (frame, &funname, &funlang, &func);
+ find_frame_funname (frame, &funname, &linkname, &funlang, &func);
annotate_frame_begin (print_level ? frame_relative_level (frame) : 0,
gdbarch, pc);
@@ -1149,6 +1160,22 @@ print_frame (struct frame_info *frame, i
ui_out_wrap_hint (uiout, " ");
annotate_frame_args ();
+ /* Print linkage name after source name if requested. */
+ if (disp_linkname && linkname)
+ {
+ char *lname = (char *)linkname;
+
+ if (strlen (lname) > MAX_LINKNAME_LEN)
+ {
+ lname = alloca (MAX_LINKNAME_LEN + 4);
+ strncpy (lname, linkname, MAX_LINKNAME_LEN);
+ strcat (lname, "...");
+ }
+ ui_out_text (uiout, " [");
+ ui_out_text (uiout, lname);
+ ui_out_text (uiout, "]");
+ }
+
ui_out_text (uiout, " (");
if (print_args)
{
Index: stack.h
===================================================================
RCS file: /cvs/src/src/gdb/stack.h,v
retrieving revision 1.16
diff -u -p -r1.16 stack.h
--- stack.h 1 Jan 2013 06:32:51 -0000 1.16
+++ stack.h 21 Mar 2013 19:00:38 -0000
@@ -23,7 +23,8 @@
void select_frame_command (char *level_exp, int from_tty);
void find_frame_funname (struct frame_info *frame, const char **funname,
- enum language *funlang, struct symbol **funcp);
+ const char **linkname, enum language *funlang,
+ struct symbol **funcp);
typedef void (*iterate_over_block_arg_local_vars_cb) (const char *print_name,
struct symbol *sym,
Index: top.c
===================================================================
RCS file: /cvs/src/src/gdb/top.c,v
retrieving revision 1.227
diff -u -p -r1.227 top.c
--- top.c 13 Mar 2013 18:34:54 -0000 1.227
+++ top.c 21 Mar 2013 19:00:38 -0000
@@ -296,6 +296,18 @@ quit_cover (void)
quit_command ((char *) 0, 0);
}
#endif /* defined SIGHUP */
+
+/* Flag for whether we want to print linkage name for functions. */
+
+int disp_linkname = 0; /* Default is no. */
+static void
+show_disp_linkname (struct ui_file *file, int from_tty,
+ struct cmd_list_element *c, const char *value)
+{
+ fprintf_filtered (file, _("\
+Whether to display linkage name for functions is %s.\n"),
+ value);
+}
/* Line number we are currently in, in a file which is being sourced. */
/* NOTE 1999-04-29: This variable will be static again, once we modify
@@ -1683,6 +1695,13 @@ When set, GDB uses the specified path to
set_gdb_datadir, NULL,
&setlist,
&showlist);
+
+ add_setshow_boolean_cmd ("display-linkname", class_support, &disp_linkname, _("\
+Set whether to display linkage name for functions."), _("\
+Show whether to display linkage name for functions."), NULL,
+ NULL,
+ show_disp_linkname,
+ &setlist, &showlist);
}
void
Index: top.h
===================================================================
RCS file: /cvs/src/src/gdb/top.h,v
retrieving revision 1.36
diff -u -p -r1.36 top.h
--- top.h 7 Jan 2013 16:40:36 -0000 1.36
+++ top.h 21 Mar 2013 19:00:38 -0000
@@ -26,6 +26,7 @@ extern int saved_command_line_size;
extern FILE *instream;
extern int in_user_command;
extern int confirm;
+extern int disp_linkname;
extern char gdb_dirbuf[1024];
extern int inhibit_gdbinit;
extern char gdbinit[];
Index: python/py-frame.c
===================================================================
RCS file: /cvs/src/src/gdb/python/py-frame.c,v
retrieving revision 1.29
diff -u -p -r1.29 py-frame.c
--- python/py-frame.c 23 Jan 2013 19:59:11 -0000 1.29
+++ python/py-frame.c 21 Mar 2013 19:00:38 -0000
@@ -123,6 +123,7 @@ frapy_name (PyObject *self, PyObject *ar
{
struct frame_info *frame;
const char *name;
+ const char *linkname;
enum language lang;
PyObject *result;
volatile struct gdb_exception except;
@@ -131,7 +132,7 @@ frapy_name (PyObject *self, PyObject *ar
{
FRAPY_REQUIRE_VALID (self, frame);
- find_frame_funname (frame, &name, &lang, NULL);
+ find_frame_funname (frame, &name, &linkname, &lang, NULL);
}
GDB_PY_HANDLE_EXCEPTION (except);