2010-11-02 5 views
3

J'utilise l'extension GNU "char** backtrace_symbols(void *buffer, int size)" pour obtenir la trace de pile, lorsqu'une exception est levée. Y at-il une fonction de bibliothèque qui convertit le symbole en une chaîne "lisible par l'homme" - pour refaire le nom mangling? Si non, j'écrirais ma propre fonction selon ce Wiki article.Convertir un symbole dans Classname :: FunctionName (Para1, Para2)

Béton:

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

Merci beaucoup,

Charly

Répondre

1
#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); 
} 

lorsqu'il fonctionne:

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

Voir la ligne pour une plus documentation com exemple complet et plus de détails à ce sujet.

+0

Je me souviens d'avoir vu une bibliothèque quelque part qui l'offrait sur plusieurs plates-formes différentes, mais je ne retrouve pas le lien. – Flexo

Questions connexes