我正在使用GNU扩展名”char** backtrace_symbols(void *buffer, int size)“要获取堆栈跟踪,当抛出异常时。是否存在将符号转换为“人类可读”字符串的库函数 - 重做名称mangling?

如果没有,我会根据这一点写自己的功能 Wiki文章.

具体的:

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

非常感谢,

charly

有帮助吗?

解决方案

#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)

请参阅在线 文档 有关更完整的示例和有关此的更多详细信息。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top