[Ltrace-devel] [PATCH v4] add library path to stack trace output when using -w

Sedat Dilek sedat.dilek at gmail.com
Thu Oct 10 08:28:32 UTC 2013


Sorry for top-posting...

Can you please add a ChangeLog to your patch (that's what I typically
see on a lot of OSS MLs)?

- Sedat -

On Thu, Oct 10, 2013 at 9:16 AM, Luca Clementi <luca.clementi at gmail.com> wrote:
> For each stack frame prints the library path containing the code
> pointed by the IP.
> The output format is similar to the return value of backtrace_symbols
> function found in glibc, e.g.:
>  > /bin/ls(_init+0x19be) [0x40398e]
>  > /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed) [0x7f50cbc3676d]
>  > /bin/ls(_init+0x25fd) [0x4045cd]
> ---
>  output.c |   38 ++++++++++++++++++++++++++++++++++----
>  1 file changed, 34 insertions(+), 4 deletions(-)
>
> diff --git a/output.c b/output.c
> index da8c419..d85c9b9 100644
> --- a/output.c
> +++ b/output.c
> @@ -548,6 +548,7 @@ free_stringp_cb(const char **stringp, void *data)
>         free((char *)*stringp);
>  }
>
> +
>  void
>  output_right(enum tof type, struct process *proc, struct library_symbol *libsym)
>  {
> @@ -670,16 +671,45 @@ again:
>             && proc->unwind_priv != NULL
>             && proc->unwind_as != NULL) {
>                 unw_cursor_t cursor;
> -               unw_word_t ip, sp;
> +               arch_addr_t ip;
> +               unw_word_t function_offset, sp;
> +               struct library *lib = NULL;
>                 int unwind_depth = options.bt_depth;
>                 char fn_name[100];
> +               const char *lib_name;
> +               size_t distance;
>
> +               /* Verify that we can cast arch_addr_t to unw_word_t.  */
> +               (void)sizeof(char[1 - 2*(sizeof(unw_word_t)
> +                                       != sizeof(arch_addr_t))]);
>                 unw_init_remote(&cursor, proc->unwind_as, proc->unwind_priv);
>                 while (unwind_depth) {
> -                       unw_get_reg(&cursor, UNW_REG_IP, &ip);
> +                       unw_get_reg(&cursor, UNW_REG_IP, (unw_word_t *) &ip);
>                         unw_get_reg(&cursor, UNW_REG_SP, &sp);
> -                       unw_get_proc_name(&cursor, fn_name, 100, NULL);
> -                       fprintf(options.output, "\t\t\t%s (ip = 0x%lx)\n", fn_name, (long) ip);
> +                       unw_get_proc_name(&cursor, fn_name, sizeof(fn_name),
> +                                       &function_offset);
> +
> +                       /* We are looking for the library with the base address
> +                        * closest to the current ip.  */
> +                       lib_name = "unmapped_area";
> +                       distance = (size_t) -1;
> +                       lib = proc->libraries;
> +                       while (lib != NULL) {
> +                               /* N.B.: Assumes sizeof(size_t) ==
> +                                * sizeof(arch_addr_t).
> +                                * Keyword: double cast.  */
> +                               if ((ip >= lib->base) &&
> +                                           ((size_t)(ip - lib->base)
> +                                           < distance)) {
> +                                       distance = ip - lib->base;
> +                                       lib_name = lib->pathname;
> +                               }
> +                               lib = lib->next;
> +                       }
> +
> +                       fprintf(options.output, " > %s(%s+0x%lx) [%p]\n",
> +                                       lib_name, fn_name, function_offset, ip);
> +
>                         if (unw_step(&cursor) <= 0)
>                                 break;
>                         unwind_depth--;
> --
> 1.7.9.5
>
>
> _______________________________________________
> Ltrace-devel mailing list
> Ltrace-devel at lists.alioth.debian.org
> http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/ltrace-devel



More information about the Ltrace-devel mailing list