diff options
Diffstat (limited to 'lldb/source/Core')
-rw-r--r-- | lldb/source/Core/Logging.cpp | 3 | ||||
-rw-r--r-- | lldb/source/Core/Mangled.cpp | 23 |
2 files changed, 26 insertions, 0 deletions
diff --git a/lldb/source/Core/Logging.cpp b/lldb/source/Core/Logging.cpp index 27a78d65851..9eb4f6676a4 100644 --- a/lldb/source/Core/Logging.cpp +++ b/lldb/source/Core/Logging.cpp @@ -150,6 +150,7 @@ lldb_private::DisableLog (const char **categories, Stream *feedback_strm) else if (0 == ::strcasecmp(arg, "jit")) flag_bits &= ~LIBLLDB_LOG_JIT_LOADER; else if (0 == ::strcasecmp(arg, "language")) flag_bits &= ~LIBLLDB_LOG_LANGUAGE; else if (0 == ::strncasecmp(arg, "formatters", 10)) flag_bits &= ~LIBLLDB_LOG_DATAFORMATTERS; + else if (0 == ::strncasecmp(arg, "demangle", 8)) flag_bits &= ~LIBLLDB_LOG_DEMANGLE; else { feedback_strm->Printf ("error: unrecognized log category '%s'\n", arg); @@ -225,6 +226,7 @@ lldb_private::EnableLog (StreamSP &log_stream_sp, uint32_t log_options, const ch else if (0 == ::strcasecmp(arg, "jit")) flag_bits |= LIBLLDB_LOG_JIT_LOADER; else if (0 == ::strcasecmp(arg, "language")) flag_bits |= LIBLLDB_LOG_LANGUAGE; else if (0 == ::strncasecmp(arg, "formatters", 10)) flag_bits |= LIBLLDB_LOG_DATAFORMATTERS; + else if (0 == ::strncasecmp(arg, "demangle", 8)) flag_bits |= LIBLLDB_LOG_DEMANGLE; else { feedback_strm->Printf("error: unrecognized log category '%s'\n", arg); @@ -251,6 +253,7 @@ lldb_private::ListLogCategories (Stream *strm) " communication - log communication activities\n" " connection - log connection details\n" " default - enable the default set of logging categories for liblldb\n" + " demangle - log mangled names to catch demangler crashes\n" " dyld - log shared library related activities\n" " events - log broadcaster, listener and event queue activities\n" " expr - log expressions\n" diff --git a/lldb/source/Core/Mangled.cpp b/lldb/source/Core/Mangled.cpp index bdc710c8f8e..543b34e337a 100644 --- a/lldb/source/Core/Mangled.cpp +++ b/lldb/source/Core/Mangled.cpp @@ -34,6 +34,8 @@ #include "llvm/ADT/DenseMap.h" #include "lldb/Core/ConstString.h" +#include "lldb/Core/Log.h" +#include "lldb/Core/Logging.h" #include "lldb/Core/Mangled.h" #include "lldb/Core/RegularExpression.h" #include "lldb/Core/Stream.h" @@ -271,6 +273,8 @@ Mangled::GetDemangledName (lldb::LanguageType language) const "Mangled::GetDemangledName (m_mangled = %s)", m_mangled.GetCString()); + Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_DEMANGLE); + // Don't bother running anything that isn't mangled const char *mangled_name = m_mangled.GetCString(); ManglingScheme mangling_scheme{cstring_mangling_scheme(mangled_name)}; @@ -285,6 +289,8 @@ Mangled::GetDemangledName (lldb::LanguageType language) const case eManglingSchemeMSVC: { #if defined(_MSC_VER) + if (log) + log->Printf("demangle msvc: %s", mangled_name); const size_t demangled_length = 2048; demangled_name = static_cast<char *>(::malloc(demangled_length)); ::ZeroMemory(demangled_name, demangled_length); @@ -295,6 +301,14 @@ Mangled::GetDemangledName (lldb::LanguageType language) const UNDNAME_NO_MEMBER_TYPE | // Strip virtual, static, etc specifiers UNDNAME_NO_MS_KEYWORDS // Strip all MS extension keywords ); + if (log) + { + if (demangled_name && demangled_name[0]) + log->Printf("demangled msvc: %s -> \"%s\"", mangled_name, demangled_name); + else + log->Printf("demangled msvc: %s -> error: 0x%" PRIx64, mangled_name, result); + } + if (result == 0) { free(demangled_name); @@ -306,6 +320,8 @@ Mangled::GetDemangledName (lldb::LanguageType language) const case eManglingSchemeItanium: { #ifdef LLDB_USE_BUILTIN_DEMANGLER + if (log) + log->Printf("demangle itanium: %s", mangled_name); // Try to use the fast-path demangler first for the // performance win, falling back to the full demangler only // when necessary @@ -315,6 +331,13 @@ Mangled::GetDemangledName (lldb::LanguageType language) const #else demangled_name = abi::__cxa_demangle(mangled_name, NULL, NULL, NULL); #endif + if (log) + { + if (demangled_name) + log->Printf("demangled itanium: %s -> \"%s\"", mangled_name, demangled_name); + else + log->Printf("demangled itanium: %s -> error: failed to demangle", mangled_name); + } break; } case eManglingSchemeNone: |