~brianaker/gearmand/osx9-fixes

512.3.10 by Brian Aker
Update safety logic around packet in function.
1
/*  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
2
 * 
621.19.30 by Brian Aker
Backport bits from SSL tree.
3
 *  Libgearman client library.
512.3.10 by Brian Aker
Update safety logic around packet in function.
4
 *
5
 *  Copyright (C) 2012 Data Differential, http://datadifferential.com/
6
 *  All rights reserved.
7
 *
8
 *  Redistribution and use in source and binary forms, with or without
9
 *  modification, are permitted provided that the following conditions are
10
 *  met:
11
 *
12
 *      * Redistributions of source code must retain the above copyright
13
 *  notice, this list of conditions and the following disclaimer.
14
 *
15
 *      * Redistributions in binary form must reproduce the above
16
 *  copyright notice, this list of conditions and the following disclaimer
17
 *  in the documentation and/or other materials provided with the
18
 *  distribution.
19
 *
20
 *      * The names of its contributors may not be used to endorse or
21
 *  promote products derived from this software without specific prior
22
 *  written permission.
23
 *
24
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25
 *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26
 *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
27
 *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
28
 *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29
 *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30
 *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31
 *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32
 *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33
 *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34
 *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35
 *
36
 */
37
621.18.5 by Brian Aker
Fix remaining usages of config.h
38
#include "gear_config.h"
621.19.16 by Brian Aker
First pass, backtrace on certain types of failures.
39
40
#include "libgearman/backtrace.hpp"
41
42
#include <cstdio>
43
#include <cstdlib>
512.3.10 by Brian Aker
Update safety logic around packet in function.
44
#include <cstring>
45
621.19.30 by Brian Aker
Backport bits from SSL tree.
46
#if defined(HAVE_SHARED_ENABLED) && HAVE_SHARED_ENABLED
47
512.3.10 by Brian Aker
Update safety logic around packet in function.
48
#ifdef HAVE_EXECINFO_H
49
#include <execinfo.h>
50
#endif
51
52
#ifdef HAVE_GCC_ABI_DEMANGLE
621.19.30 by Brian Aker
Backport bits from SSL tree.
53
# include <cxxabi.h>
783.2.1 by Brian Aker
Update gearman_connection_create()
54
# ifdef HAVE_DLFCN_H
55
#  define USE_DEMANGLE 1
56
#  include <dlfcn.h>
57
# else
58
#  define USE_DEMANGLE 0
59
# endif   
621.19.30 by Brian Aker
Backport bits from SSL tree.
60
#endif   
61
62
const int MAX_DEPTH= 50;
63
512.3.10 by Brian Aker
Update safety logic around packet in function.
64
void custom_backtrace(void)
65
{
66
#ifdef HAVE_EXECINFO_H
621.19.30 by Brian Aker
Backport bits from SSL tree.
67
  void *backtrace_buffer[MAX_DEPTH +1];
68
69
  int stack_frames= backtrace(backtrace_buffer, MAX_DEPTH);
621.39.1 by Brian Aker
Small cleanups, extend backtrace message.
70
  fprintf(stderr, "\nBegin stack trace, frames found: %d\n", stack_frames);
621.19.30 by Brian Aker
Backport bits from SSL tree.
71
  if (stack_frames)
72
  {
73
    char **symbollist= backtrace_symbols(backtrace_buffer, stack_frames);
74
    if (symbollist)
75
    {
76
      for (int x= 0; x < stack_frames; x++) 
77
      {
78
        bool was_demangled= false;
79
783.2.1 by Brian Aker
Update gearman_connection_create()
80
#if defined(USE_DEMANGLE)
621.19.30 by Brian Aker
Backport bits from SSL tree.
81
        if (USE_DEMANGLE)
82
        {
83
          Dl_info dlinfo;
84
          if (dladdr(backtrace_buffer[x], &dlinfo))
85
          {
86
            char demangled_buffer[1024];
87
            const char *called_in= "<unresolved>";
88
            if (dlinfo.dli_sname)
89
            {
90
              size_t demangled_size= sizeof(demangled_buffer);
91
              int status;
92
              char* demangled;
93
              if ((demangled= abi::__cxa_demangle(dlinfo.dli_sname, demangled_buffer, &demangled_size, &status)))
94
              {
95
                called_in= demangled;
96
                fprintf(stderr, "---> demangled: %s -> %s\n", demangled_buffer, demangled);
97
              }
98
              else
99
              {
100
                called_in= dlinfo.dli_sname;
101
              }
102
103
              was_demangled= true;
104
              fprintf(stderr, "#%d  %p in %s at %s\n",
105
                      x, backtrace_buffer[x],
106
                      called_in,
107
                      dlinfo.dli_fname);
108
            }
109
          }
110
        }
783.2.1 by Brian Aker
Update gearman_connection_create()
111
#endif // USE_DEMANGLE
621.19.30 by Brian Aker
Backport bits from SSL tree.
112
113
        if (was_demangled == false)
114
        {
115
          fprintf(stderr, "?%d  %p in %s\n", x, backtrace_buffer[x], symbollist[x]);
116
        }
117
      }
118
119
      ::free(symbollist);
120
    }
121
  }
512.3.10 by Brian Aker
Update safety logic around packet in function.
122
#endif // HAVE_EXECINFO_H
123
}
621.19.30 by Brian Aker
Backport bits from SSL tree.
124
125
#else // HAVE_SHARED_ENABLED
126
127
void custom_backtrace(void)
128
{
129
  fprintf(stderr, "Backtrace null function called\n");
130
}
131
#endif // AX_ENABLE_BACKTRACE