am 9dfb00c1
: Merge "Use the libcxxabi __cxa_demangle."
* commit '9dfb00c1d48545a2627c2aded62d3a79749351fb': Use the libcxxabi __cxa_demangle.
This commit is contained in:
commit
87c4493048
2 changed files with 5 additions and 19 deletions
|
@ -1221,7 +1221,8 @@ LOCAL_CXX_STL := none
|
|||
LOCAL_SYSTEM_SHARED_LIBRARIES :=
|
||||
# Only need this for arm since libc++ uses its own unwind code that
|
||||
# doesn't mix with the other default unwind code.
|
||||
LOCAL_STATIC_LIBRARIES_arm := libunwind_llvm libc++abi
|
||||
LOCAL_STATIC_LIBRARIES_arm := libunwind_llvm
|
||||
LOCAL_STATIC_LIBRARIES += libc++abi
|
||||
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
|
||||
|
||||
# Don't install on release build
|
||||
|
|
|
@ -47,34 +47,20 @@
|
|||
|
||||
typedef struct _Unwind_Context __unwind_context;
|
||||
|
||||
extern "C" char* __cxa_demangle(const char*, char*, size_t*, int*);
|
||||
|
||||
static mapinfo_t* g_map_info = NULL;
|
||||
static void* g_demangler;
|
||||
typedef char* (*DemanglerFn)(const char*, char*, size_t*, int*);
|
||||
static DemanglerFn g_demangler_fn = NULL;
|
||||
|
||||
__LIBC_HIDDEN__ void backtrace_startup() {
|
||||
ScopedDisableDebugCalls disable;
|
||||
|
||||
g_map_info = mapinfo_create(getpid());
|
||||
g_demangler = dlopen("libgccdemangle.so", RTLD_NOW);
|
||||
if (g_demangler != NULL) {
|
||||
void* sym = dlsym(g_demangler, "__cxa_demangle");
|
||||
g_demangler_fn = reinterpret_cast<DemanglerFn>(sym);
|
||||
}
|
||||
}
|
||||
|
||||
__LIBC_HIDDEN__ void backtrace_shutdown() {
|
||||
ScopedDisableDebugCalls disable;
|
||||
|
||||
mapinfo_destroy(g_map_info);
|
||||
dlclose(g_demangler);
|
||||
}
|
||||
|
||||
static char* demangle(const char* symbol) {
|
||||
if (g_demangler_fn == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
return (*g_demangler_fn)(symbol, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
struct stack_crawl_state_t {
|
||||
|
@ -158,8 +144,7 @@ __LIBC_HIDDEN__ void log_backtrace(uintptr_t* frames, size_t frame_count) {
|
|||
soname = "<unknown>";
|
||||
}
|
||||
if (symbol != NULL) {
|
||||
// TODO: we might need a flag to say whether it's safe to allocate (demangling allocates).
|
||||
char* demangled_symbol = demangle(symbol);
|
||||
char* demangled_symbol = __cxa_demangle(symbol, NULL, NULL, NULL);
|
||||
const char* best_name = (demangled_symbol != NULL) ? demangled_symbol : symbol;
|
||||
|
||||
__libc_format_log(ANDROID_LOG_ERROR, "libc",
|
||||
|
|
Loading…
Reference in a new issue