2010-10-29 17 views
2

Je voulais savoir si un éventuel portage est disponible pour l'implémentation de trace arrière pour uclibc dans arm que je peux utiliser dans mon gestionnaire de signal pour déboguer des fautes de segmentation.trace arrière pour ulibc dans le bras

J'ai rencontré un code utile here et j'ai essayé de l'utiliser dans mon gestionnaire de signal mais il échoue à la première vérification et revient à partir de là.

J'ai également essayé une fonction de retour arrière récurrente qui a simplement été récursée en utilisant (current_frame_p) -3) jusqu'à ce qu'elle soit NULL et imprimée (current_frame_p) -1). Cela aussi semble me donner des problèmes. Tout ce que je reçois est l'adresse du gestionnaire et une grande adresse de déchets (je suppose que c'est peut-être l'adresse du signal). Mais je ne vais pas au-delà de ça. Je veux que ma trace dépasse cela.

Le code qui se bloque est délibérément écrit pour déboguer à déréférencer et adresse non valide.

Toute aide sera grandement appréciée.

Merci beaucoup à l'avance.

-Keshav

Répondre

3

Nous utilisons le code suivant sur un dispositif de bras (glibc cependant). J'ai trouvé ce code il y a quelques années (je ne me rappelle plus exactement où). Cela fonctionne très bien sans aucun problème.

void __printBacktrace(int skipCount,bool segv=false) 
{ 

int * func_addresses[BACKTRACE_MAXDEPTH]; 
char demangle_output[1000]; 
int nfuncs = __arm_backtrace(func_addresses, BACKTRACE_MAXDEPTH); 
printf("----- Start Stack Trace -----\n"); 
for (int i = skipCount; i < nfuncs; ++i) 
{ 
    Dl_info info; 
    if (dladdr(func_addresses[i], &info)) 
    { 
     int dStat; 
     size_t dLength = 1000; 
     char * demangled = abi::__cxa_demangle(info.dli_sname, 
       demangle_output, &dLength, &dStat); 
     if (demangled && !dStat) 
     printf(
       "return addr: %p: object:%s %p symbol:%s [%p+0x%x]\n", 
       func_addresses[i], info.dli_fname, info.dli_fbase, 
       demangled, info.dli_saddr, (int) func_addresses[i] 
       - (int) info.dli_saddr); 
     else 
     printf(
       "return addr: %p: object:%s %p symbol:%s [%p+0x%x]\n", 
       func_addresses[i], info.dli_fname, info.dli_fbase, 
       info.dli_sname, info.dli_saddr, (int) func_addresses[i] 
       - (int) info.dli_saddr); 
    } else 
    fprintf(fCrash, "return addr: %p\n", func_addresses[i]); 
} 
printf("----- End Stack Trace -----\n"); 


} 

et

int __arm_backtrace(int **arr, int maxsize) 

{ 

    int cnt = 0; 
void *fp = __builtin_frame_address(0); 
struct layout *lp = (struct layout *) ((char*) fp - 12); 
while (cnt < maxsize) 
{ 

    arr[cnt++] = (int *) lp->return_address; 
    if (!lp->next) 
    { 
     break; 
    } 
    lp = lp->next - 1; 
} 
return cnt; 
} 
+0

Merci à tous Avivl. Je vais le lister et vous faire savoir si cela fonctionne aussi dans uclibc. –

+0

Merci une tonne Avivl. Je vais essayer et vous faire savoir si cela fonctionne aussi dans uclibc. –

+2

Qu'est-ce que struct layout et quels sont les paramètres de la structure? – Mandar

0

Je sais que la question était sur uclibc, mais je l'ai trouvé comment obtenir travailler avec glibc backtrace maintenant donc je pensais que je dirais. Utilisez "gcc -funwind-tables -rdynamic". L'option unwind-tables fait fonctionner libc: backtrace() et l'option dynamique fait fonctionner libc: backtrace_symbols().