| Index: Source/wtf/Assertions.cpp
|
| diff --git a/Source/wtf/Assertions.cpp b/Source/wtf/Assertions.cpp
|
| index 67c0675af4e072324b121b0f296390474df8da4c..1fcd38350a8513a444a6e6771c33e923ccf64f6a 100644
|
| --- a/Source/wtf/Assertions.cpp
|
| +++ b/Source/wtf/Assertions.cpp
|
| @@ -262,24 +262,38 @@ void WTFReportBacktrace(int framesToShow)
|
| WTFPrintBacktrace(samples + framesToSkip, frames - framesToSkip);
|
| }
|
|
|
| -void WTFPrintBacktrace(void** stack, int size)
|
| +FrameToNameScope::FrameToNameScope(void* addr)
|
| + : m_name(0)
|
| + , m_cxaDemangled(0)
|
| {
|
| - for (int i = 0; i < size; ++i) {
|
| - const char* mangledName = 0;
|
| - char* cxaDemangled = 0;
|
| #if OS(MACOSX) || (OS(LINUX) && !defined(__UCLIBC__))
|
| - Dl_info info;
|
| - if (dladdr(stack[i], &info) && info.dli_sname)
|
| - mangledName = info.dli_sname;
|
| - if (mangledName)
|
| - cxaDemangled = abi::__cxa_demangle(mangledName, 0, 0, 0);
|
| + Dl_info info;
|
| + if (!dladdr(addr, &info) || !info.dli_sname)
|
| + return;
|
| + const char* mangledName = info.dli_sname;
|
| + if ((m_cxaDemangled = abi::__cxa_demangle(mangledName, 0, 0, 0)))
|
| + m_name = m_cxaDemangled;
|
| + else
|
| + m_name = mangledName;
|
| +#else
|
| + (void)addr;
|
| #endif
|
| +}
|
| +
|
| +FrameToNameScope::~FrameToNameScope()
|
| +{
|
| + free(m_cxaDemangled);
|
| +}
|
| +
|
| +void WTFPrintBacktrace(void** stack, int size)
|
| +{
|
| + for (int i = 0; i < size; ++i) {
|
| + FrameToNameScope frameToName(stack[i]);
|
| const int frameNumber = i + 1;
|
| - if (mangledName || cxaDemangled)
|
| - printf_stderr_common("%-3d %p %s\n", frameNumber, stack[i], cxaDemangled ? cxaDemangled : mangledName);
|
| + if (frameToName.nullableName())
|
| + printf_stderr_common("%-3d %p %s\n", frameNumber, stack[i], frameToName.nullableName());
|
| else
|
| printf_stderr_common("%-3d %p\n", frameNumber, stack[i]);
|
| - free(cxaDemangled);
|
| }
|
| }
|
|
|
|
|