diff options
author | Mark Wielaard <mjw@redhat.com> | 2013-12-23 00:47:06 +0100 |
---|---|---|
committer | Mark Wielaard <mjw@redhat.com> | 2013-12-31 11:58:42 +0100 |
commit | 99fc3f7d948612c1769dc3378199f56209dbfa1d (patch) | |
tree | 1246480bfccdfb6e9a272d03ebe762016cb71504 | |
parent | 9fec14aadf1da165feb2ade1ae66b9419039b719 (diff) | |
download | elfutils-99fc3f7d948612c1769dc3378199f56209dbfa1d.tar.gz |
stack: -b, --build-id shows module build-id, load address and pc offset.
A convenient format for offline processing of the backtrace.
Signed-off-by: Mark Wielaard <mjw@redhat.com>
-rw-r--r-- | src/ChangeLog | 8 | ||||
-rw-r--r-- | src/stack.c | 31 |
2 files changed, 35 insertions, 4 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index d3d68078..4737d697 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,11 @@ +2013-12-23 Mark Wielaard <mjw@redhat.com> + + * stack.c (show_build_id): New static boolean. + (print_frames): Print module build-id, load address and pc offset + if show_build_id is true. + (parse_opt): Handle '-b'. + (main): Add -b to options. + 2013-12-22 Mark Wielaard <mjw@redhat.com> * stack.c (maxframes): New static unsigned. Initialize to 64. diff --git a/src/stack.c b/src/stack.c index 188aa005..362cc065 100644 --- a/src/stack.c +++ b/src/stack.c @@ -38,6 +38,7 @@ ARGP_PROGRAM_BUG_ADDRESS_DEF = PACKAGE_BUGREPORT; static bool show_activation = false; static bool show_module = false; +static bool show_build_id = false; static bool show_source = false; static bool show_one_tid = false; @@ -116,15 +117,31 @@ print_frames (struct frames *frames) if (symname != NULL) printf (" %s", symname); + const char* fname; + Dwarf_Addr start; + fname = dwfl_module_info(mod, NULL, &start, + NULL, NULL, NULL, NULL, NULL); if (show_module) { - const char* fname; - fname = dwfl_module_info(mod, - NULL, NULL, NULL, NULL, NULL, NULL, NULL); if (fname != NULL) printf (" - %s", fname); } + if (show_build_id) + { + const unsigned char *id; + GElf_Addr id_vaddr; + int id_len = dwfl_module_build_id (mod, &id, &id_vaddr); + if (id_len > 0) + { + printf ("\n ["); + do + printf ("%02" PRIx8, *id++); + while (--id_len > 0); + printf ("]@0x%0" PRIx64 "+%" PRIx64, start, pc_adjusted - start); + } + } + if (show_source) { Dwfl_Line *lineobj = dwfl_module_getsrc(mod, pc_adjusted); @@ -203,6 +220,10 @@ parse_opt (int key, char *arg __attribute__ ((unused)), show_activation = show_source = show_module = true; break; + case 'b': + show_build_id = true; + break; + case '1': show_one_tid = true; break; @@ -243,6 +264,8 @@ main (int argc, char **argv) N_("Additionally show source file information"), 0 }, { "verbose", 'v', NULL, 0, N_("Show all additional information (activation, module and source)"), 0 }, + { "build-id", 'b', NULL, 0, + N_("Show module build-id, load address and pc offset"), 0 }, { NULL, '1', NULL, 0, N_("Show the backtrace of only one thread"), 0 }, { NULL, 'n', "MAXFRAMES", 0, @@ -270,7 +293,7 @@ Only real user processes are supported, no kernel or process maps."), argp_parse (&argp, argc, argv, 0, &remaining, &dwfl); assert (dwfl != NULL); if (remaining != argc) - error (2, 0, "eu-stack [-a] [-m] [-s] [-v] [-1] [-n MAXFRAMES]" + error (2, 0, "eu-stack [-a] [-m] [-b] [-s] [-v] [-1] [-n MAXFRAMES]" " [--debuginfo-path=<path>]" " {-p <process id>|--core=<file> [--executable=<file>]|--help}"); |