7580d579f5dbe375c7cb6882ee4cee3f76fa5a46
2 +--------------------------------------------------------------------+
3 | libmemcached-awesome - C/C++ Client Library for memcached |
4 +--------------------------------------------------------------------+
5 | Redistribution and use in source and binary forms, with or without |
6 | modification, are permitted under the terms of the BSD license. |
7 | You should have received a copy of the license in a bundled file |
8 | named LICENSE; in case you did not receive a copy you can review |
9 | the terms online at: https://opensource.org/licenses/BSD-3-Clause |
10 +--------------------------------------------------------------------+
11 | Copyright (c) 2006-2014 Brian Aker https://datadifferential.com/ |
12 | Copyright (c) 2020-2021 Michael Wallner https://awesome.co/ |
13 +--------------------------------------------------------------------+
16 #include "mem_config.h"
18 #include "libmemcached/backtrace.hpp"
26 # include BACKTRACE_HEADER
28 # ifdef HAVE_ABI____CXA_DEMANGLE
36 const int MAX_DEPTH
= 50;
38 void custom_backtrace(void) {
39 void *backtrace_buffer
[MAX_DEPTH
+ 1];
41 int stack_frames
= backtrace(backtrace_buffer
, MAX_DEPTH
);
43 char **symbollist
= backtrace_symbols(backtrace_buffer
, stack_frames
);
45 for (int x
= 0; x
< stack_frames
; x
++) {
46 bool was_demangled
= false;
48 # ifdef HAVE_ABI____CXA_DEMANGLE
51 if (dladdr(backtrace_buffer
[x
], &dlinfo
)) {
52 char demangled_buffer
[1024];
53 const char *called_in
= "<unresolved>";
54 if (dlinfo
.dli_sname
) {
55 size_t demangled_size
= sizeof(demangled_buffer
);
58 if ((demangled
= abi::__cxa_demangle(dlinfo
.dli_sname
, demangled_buffer
,
59 &demangled_size
, &status
))) {
60 called_in
= demangled
;
61 fprintf(stderr
, "---> demangled: %s -> %s\n", demangled_buffer
, demangled
);
63 called_in
= dlinfo
.dli_sname
;
67 fprintf(stderr
, "#%d %p in %s at %s\n", x
, backtrace_buffer
[x
], called_in
,
74 if (was_demangled
== false) {
75 fprintf(stderr
, "?%d %p in %s\n", x
, backtrace_buffer
[x
], symbollist
[x
]);
84 #else // HAVE_BACKTRACE
86 void custom_backtrace(void) {
87 fprintf(stderr
, "Backtrace null function called\n");
89 #endif // HAVE_BACKTRACE