Stack Overflow上一个__cxa_demangle使用例子
#include <cxxabi.h> #include <string.h> #include <array> #include <iostream> int main() { const std::array<const char *, 5> bt = { "./src/warzone2100(_ZNK5EcKey4signEPKvm+0x98) [0x16405da]", "./src/warzone2100(_Z8recvPing8NETQUEUE+0x1ab) [0x126bc2d]", "./src/warzone2100(_ZN27WzMultiplayerOptionsTitleUI21frontendMultiMessagesEb+0x7d9) [0x11ce219]", "./src/warzone2100(_ZN27WzMultiplayerOptionsTitleUI3runEv+0x45) [0x11cf32b]", "./src/warzone2100(_Z9titleLoopv+0x1aa) [0x1480b35]", }; std::cout << "Wrong way:" << std::endl << std::endl; for (const char* p : bt) { int status; char *demangled = abi::__cxa_demangle(p, NULL, NULL, &status); std::cout << p << " " << status << std::endl; free(demangled); } auto trim = [](const char *in, char *out) { const char *begin = strchr(in, '_'); const char *end = strchr(begin, '+'); memcpy(out, begin, end - begin); out[end - begin] = '\0'; }; std::cout << std::endl << "Right way:" << std::endl << std::endl; for (const char* p : bt) { int status; char buf[1024]; trim(p, buf); char *demangled = abi::__cxa_demangle(buf, NULL, NULL, &status); std::cout << buf << " -> " << demangled << " " << status << std::endl; free(demangled); } }
执行结果
g++ -g foo.cc && ./a.out Wrong way: ./src/warzone2100(_ZNK5EcKey4signEPKvm+0x98) [0x16405da] -2 ./src/warzone2100(_Z8recvPing8NETQUEUE+0x1ab) [0x126bc2d] -2 ./src/warzone2100(_ZN27WzMultiplayerOptionsTitleUI21frontendMultiMessagesEb+0x7d9) [0x11ce219] -2 ./src/warzone2100(_ZN27WzMultiplayerOptionsTitleUI3runEv+0x45) [0x11cf32b] -2 ./src/warzone2100(_Z9titleLoopv+0x1aa) [0x1480b35] -2 Right way: _ZNK5EcKey4signEPKvm -> EcKey::sign(void const*, unsigned long) const 0 _Z8recvPing8NETQUEUE -> recvPing(NETQUEUE) 0 _ZN27WzMultiplayerOptionsTitleUI21frontendMultiMessagesEb -> WzMultiplayerOptionsTitleUI::frontendMultiMessages(bool) 0 _ZN27WzMultiplayerOptionsTitleUI3runEv -> WzMultiplayerOptionsTitleUI::run() 0 _Z9titleLoopv -> titleLoop() 0