Преобразовать символ в Classname :: FunctionName (Para1, Para2) - PullRequest
3 голосов
/ 02 ноября 2010

Я использую расширение GNU "char** backtrace_symbols(void *buffer, int size)", чтобы получить трассировку стека при возникновении исключения.Существует ли библиотечная функция, которая преобразует символ в «читаемую человеком» строку - для повторения искажения имени?

Если нет, я бы написал свою собственную функцию в соответствии с этой вики статьей .

Бетон:

Input:  test.exe(_ZN10CTLTestApp12ExecuteGroupEPK19CTLTestCaseRegisterNS_11EReportTypeE+0x24c) 
Output: test.exe CTLTestApp::ExecuteGroup( CTLTestCaseRegister, EReportType )

Большое спасибо,

Чарли

1 Ответ

1 голос
/ 02 ноября 2010
#include <cxxabi.h> 
#include <iostream>
#include <cstdlib>

int main() {
  int status;
  const std::string name = "_ZN10CTLTestApp12ExecuteGroupEPK19CTLTestCaseRegisterNS_11EReportTypeE";
  char *realname = abi::__cxa_demangle(name.c_str(), 0, 0, &status);
  std::cout << realname << "(" << status << ")" << std::endl;
  free(realname);
}

Бег дает:

CTLTestApp::ExecuteGroup(CTLTestCaseRegister const*, CTLTestApp::EReportType)(0)

См. Онлайн документацию для более полного примера и дополнительной информации об этом.

...