forked from premiere/premiere-libtorrent
demangles symbols in assert tracebacks
This commit is contained in:
parent
86de8b8bf6
commit
904d9bb50b
|
@ -33,7 +33,11 @@ POSSIBILITY OF SUCH DAMAGE.
|
|||
#ifndef TORRENT_ASSERT
|
||||
|
||||
#include "libtorrent/config.hpp"
|
||||
#include <cassert>
|
||||
#include <string>
|
||||
|
||||
#ifdef __GNUC__
|
||||
std::string demangle(char const* name);
|
||||
#endif
|
||||
|
||||
#if (defined __linux__ || defined __MACH__) && defined __GNUC__ && !defined(NDEBUG)
|
||||
|
||||
|
|
|
@ -30,6 +30,35 @@ POSSIBILITY OF SUCH DAMAGE.
|
|||
|
||||
*/
|
||||
|
||||
#ifdef __GNUC__
|
||||
|
||||
#include <cxxabi.h>
|
||||
#include <string>
|
||||
#include <stdlib.h>
|
||||
|
||||
std::string demangle(char const* name)
|
||||
{
|
||||
// in case this string comes
|
||||
char const* start = strchr(name, '(');
|
||||
if (start != 0) ++start;
|
||||
else start = name;
|
||||
char const* end = strchr(start, '+');
|
||||
|
||||
std::string in;
|
||||
if (end == 0) in.assign(start);
|
||||
else in.assign(start, end);
|
||||
|
||||
size_t len;
|
||||
int status;
|
||||
char* unmangled = ::abi::__cxa_demangle(in.c_str(), 0, &len, &status);
|
||||
if (unmangled == 0) return in;
|
||||
std::string ret(unmangled);
|
||||
free(unmangled);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef NDEBUG
|
||||
|
||||
#include <stdlib.h>
|
||||
|
@ -58,7 +87,7 @@ void assert_fail(char const* expr, int line, char const* file, char const* funct
|
|||
|
||||
for (int i = 0; i < size; ++i)
|
||||
{
|
||||
fprintf(stderr, "%d: %s\n", i, symbols[i]);
|
||||
fprintf(stderr, "%d: %s\n", i, demangle(symbols[i]).c_str());
|
||||
}
|
||||
|
||||
free(symbols);
|
||||
|
|
Loading…
Reference in New Issue