Skip to content

Commit

Permalink
Remove old debug/backtracesyms files, replace with elf versions.
Browse files Browse the repository at this point in the history
  • Loading branch information
Andreas Jaeger committed Mar 20, 2012
1 parent ff962fb commit 1d6c3d2
Show file tree
Hide file tree
Showing 4 changed files with 147 additions and 267 deletions.
81 changes: 73 additions & 8 deletions debug/backtracesyms.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* Return list with names for address in backtrace.
Copyright (C) 1998, 2000 Free Software Foundation, Inc.
Copyright (C) 1998,1999,2000,2001,2003,2009 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
Expand All @@ -17,39 +17,104 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */

#include <assert.h>
#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <ldsodefs.h>

/* Assume the worst for the width of an address. */
#define WORD_WIDTH 16
#if __ELF_NATIVE_CLASS == 32
# define WORD_WIDTH 8
#else
/* We assyme 64bits. */
# define WORD_WIDTH 16
#endif


char **
__backtrace_symbols (array, size)
void *const *array;
int size;
{
Dl_info info[size];
int status[size];
int cnt;
size_t total = 0;
char **result;

/* We can compute the text size needed for the symbols since we print
them all as "[+0x<addr>]". */
total = size * (WORD_WIDTH + 6);
/* Fill in the information we can get from `dladdr'. */
for (cnt = 0; cnt < size; ++cnt)
{
struct link_map *map;
status[cnt] = _dl_addr (array[cnt], &info[cnt], &map, NULL);
if (status[cnt] && info[cnt].dli_fname && info[cnt].dli_fname[0] != '\0')
{
/* We have some info, compute the length of the string which will be
"<file-name>(<sym-name>+offset) [address]. */
total += (strlen (info[cnt].dli_fname ?: "")
+ strlen (info[cnt].dli_sname ?: "")
+ 3 + WORD_WIDTH + 3 + WORD_WIDTH + 5);

/* The load bias is more useful to the user than the load
address. The use of these addresses is to calculate an
address in the ELF file, so its prelinked bias is not
something we want to subtract out. */
info[cnt].dli_fbase = (void *) map->l_addr;
}
else
total += 5 + WORD_WIDTH;
}

/* Allocate memory for the result. */
result = malloc (size * sizeof (char *) + total);
result = (char **) malloc (size * sizeof (char *) + total);
if (result != NULL)
{
char *last = (char *) (result + size);

for (cnt = 0; cnt < size; ++cnt)
{
result[cnt] = last;
last += 1 + sprintf (last, "[+%p]", array[cnt]);

if (status[cnt]
&& info[cnt].dli_fname != NULL && info[cnt].dli_fname[0] != '\0')
{
if (info[cnt].dli_sname == NULL)
/* We found no symbol name to use, so describe it as
relative to the file. */
info[cnt].dli_saddr = info[cnt].dli_fbase;

if (info[cnt].dli_sname == NULL && info[cnt].dli_saddr == 0)
last += 1 + sprintf (last, "%s(%s) [%p]",
info[cnt].dli_fname ?: "",
info[cnt].dli_sname ?: "",
array[cnt]);
else
{
char sign;
ptrdiff_t offset;
if (array[cnt] >= (void *) info[cnt].dli_saddr)
{
sign = '+';
offset = array[cnt] - info[cnt].dli_saddr;
}
else
{
sign = '-';
offset = info[cnt].dli_saddr - array[cnt];
}

last += 1 + sprintf (last, "%s(%s%c%#tx) [%p]",
info[cnt].dli_fname ?: "",
info[cnt].dli_sname ?: "",
sign, offset, array[cnt]);
}
}
else
last += 1 + sprintf (last, "[%p]", array[cnt]);
}
assert (last <= (char *) result + size * sizeof (char *) + total);
}

return result;
Expand Down
86 changes: 74 additions & 12 deletions debug/backtracesymsfd.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* Write formatted list with names for addresses in backtrace to a file.
Copyright (C) 1998, 2003, 2005 Free Software Foundation, Inc.
Copyright (C) 1998,2000,2003,2005,2009,2011 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
Expand All @@ -22,7 +22,7 @@
#include <sys/uio.h>

#include <stdio-common/_itoa.h>
#include <not-cancel.h>
#include <ldsodefs.h>

#if __ELF_NATIVE_CLASS == 32
# define WORD_WIDTH 8
Expand All @@ -38,25 +38,87 @@ __backtrace_symbols_fd (array, size, fd)
int size;
int fd;
{
struct iovec iov[3];
struct iovec iov[9];
int cnt;

for (cnt = 0; cnt < size; ++cnt)
{
char buf[WORD_WIDTH];
char buf2[WORD_WIDTH];
Dl_info info;
struct link_map *map;
size_t last = 0;

iov[0].iov_base = (void *) "[0x";
iov[0].iov_len = 3;
if (_dl_addr (array[cnt], &info, &map, NULL)
&& info.dli_fname != NULL && info.dli_fname[0] != '\0')
{
/* Name of the file. */
iov[0].iov_base = (void *) info.dli_fname;
iov[0].iov_len = strlen (info.dli_fname);
last = 1;

iov[1].iov_base = _itoa_word ((unsigned long int) array[cnt],
&buf[WORD_WIDTH], 16, 0);
iov[1].iov_len = &buf[WORD_WIDTH] - (char *) iov[1].iov_base;
if (info.dli_sname != NULL || map->l_addr != 0)
{
size_t diff;

iov[2].iov_base = (void *) "]\n";
iov[2].iov_len = 2;
iov[last].iov_base = (void *) "(";
iov[last].iov_len = 1;
++last;

/* We prefer to use the non-cancelable interface if it is available. */
writev_not_cancel_no_status (fd, iov, 3);
if (info.dli_sname != NULL)
{
/* We have a symbol name. */
iov[last].iov_base = (void *) info.dli_sname;
iov[last].iov_len = strlen (info.dli_sname);
++last;
}
else
/* We have no symbol, so describe it as relative to the file.
The load bias is more useful to the user than the load
address. The use of these addresses is to calculate an
address in the ELF file, so its prelinked bias is not
something we want to subtract out. */
info.dli_saddr = (void *) map->l_addr;

if (array[cnt] >= (void *) info.dli_saddr)
{
iov[last].iov_base = (void *) "+0x";
diff = array[cnt] - info.dli_saddr;
}
else
{
iov[last].iov_base = (void *) "-0x";
diff = info.dli_saddr - array[cnt];
}
iov[last].iov_len = 3;
++last;

iov[last].iov_base = _itoa_word ((unsigned long int) diff,
&buf2[WORD_WIDTH], 16, 0);
iov[last].iov_len = (&buf2[WORD_WIDTH]
- (char *) iov[last].iov_base);
++last;

iov[last].iov_base = (void *) ")";
iov[last].iov_len = 1;
++last;
}
}

iov[last].iov_base = (void *) "[0x";
iov[last].iov_len = 3;
++last;

iov[last].iov_base = _itoa_word ((unsigned long int) array[cnt],
&buf[WORD_WIDTH], 16, 0);
iov[last].iov_len = &buf[WORD_WIDTH] - (char *) iov[last].iov_base;
++last;

iov[last].iov_base = (void *) "]\n";
iov[last].iov_len = 2;
++last;

__writev (fd, iov, last);
}
}
weak_alias (__backtrace_symbols_fd, backtrace_symbols_fd)
Expand Down
122 changes: 0 additions & 122 deletions sysdeps/generic/backtracesyms.c

This file was deleted.

Loading

0 comments on commit 1d6c3d2

Please sign in to comment.