Back to index

glibc  2.9
Defines | Functions
backtracesymsfd.c File Reference
#include <execinfo.h>
#include <string.h>
#include <sys/uio.h>
#include <stdio-common/_itoa.h>
#include <ldsodefs.h>

Go to the source code of this file.

Defines

#define WORD_WIDTH   16

Functions

void __backtrace_symbols_fd (void *const *array, int size, int fd)

Define Documentation

#define WORD_WIDTH   16

Definition at line 32 of file backtracesymsfd.c.


Function Documentation

void __backtrace_symbols_fd ( void *const array,
int  size,
int  fd 
)

Definition at line 37 of file backtracesymsfd.c.

{
  struct iovec iov[9];
  int cnt;

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

      if (_dl_addr (array[cnt], &info, NULL, NULL)
         && info.dli_fname && 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;

         /* Symbol name.  */
         if (info.dli_sname != NULL)
           {
             char buf2[WORD_WIDTH];
             size_t diff;

             iov[1].iov_base = (void *) "(";
             iov[1].iov_len = 1;
             iov[2].iov_base = (void *) info.dli_sname;
             iov[2].iov_len = strlen (info.dli_sname);

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

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

             iov[5].iov_base = (void *) ")";
             iov[5].iov_len = 1;

             last = 6;
           }
       }

      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);
    }
}

Here is the call graph for this function: