
1: /* Return list with names for address in backtrace. 2: Copyright (C) 1998, 2000 Free Software Foundation, Inc. 3: This file is part of the GNU C Library. 4: Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. 5: 6: The GNU C Library is free software; you can redistribute it and/or 7: modify it under the terms of the GNU Lesser General Public 8: License as published by the Free Software Foundation; either 9: version 2.1 of the License, or (at your option) any later version. 10: 11: The GNU C Library is distributed in the hope that it will be useful, 12: but WITHOUT ANY WARRANTY; without even the implied warranty of 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14: Lesser General Public License for more details. 15: 16: You should have received a copy of the GNU Lesser General Public 17: License along with the GNU C Library; if not, write to the Free 18: Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 19: 02111-1307 USA. */ 20: 21: #include <execinfo.h> 22: #include <stdlib.h> 23: #include <string.h> 24: 25: 26: /* Assume the worst for the width of an address. */ 27: #define WORD_WIDTH 16 28: 29: 30: char ** 31: __backtrace_symbols (array, size) 32: void *const *array; 33: int size; 34: { 35: int cnt; 36: size_t total = 0; 37: char **result; 38: 39: /* We can compute the text size needed for the symbols since we print 40: them all as "[+0x<addr>]". */ 41: total = size * (WORD_WIDTH + 6); 42: 43: /* Allocate memory for the result. */ 44: result = malloc (size * sizeof (char *) + total); 45: if (result != NULL) 46: { 47: char *last = (char *) (result + size); 48: 49: for (cnt = 0; cnt < size; ++cnt) 50: { 51: result[cnt] = last; 52: last += 1 + sprintf (last, "[+%p]", array[cnt]); 53: } 54: } 55: 56: return result; 57: } 58: weak_alias (__backtrace_symbols, backtrace_symbols)