2010-11-25 11 views
1

J'essaie d'imprimer une pile d'appels depuis un programme. Malheureusement, appeler glibc backtrace() me renvoie toujours une seule adresse d'enregistrement de la fonction en cours. Je travaille sur sh4-linux, ce qui cause probablement le problème. Je n'ai eu aucun problème en l'imprimant sur l'architecture x86.Backtrace sur sh4-linux retourne une fonction

code Exemple:

#include <string> 
#include <iostream> 
#include <execinfo.h> 

const int maxCalls = 666; 

void baz() 
{ 
     void *buffer[ maxCalls ]; 
     int stackSize = backtrace(buffer, maxCalls); 

     char **symbols = backtrace_symbols(buffer, stackSize); 

     std::string str; 

     for(unsigned i = 0; i < stackSize; ++i) 
     { 
       str+= symbols[i]; 
     } 
     free(symbols); 
     std::cout << str<< std::endl; 
} 

void bar() 
{ 
     baz(); 
} 

void foo() 
{ 
     bar(); 
} 

int main(int argc, char **argv) 
{ 
     foo(); 
     return 0; 
} 

qui a été compilé par:

sh4-linux-g++ test.cpp -g -c -o test.o 
sh4-linux-g++ test.o -g -rdynamic -o test 

EDIT: En fait, ce code fonctionne très bien. Probablement un drapeau de compilateur provoque ce comportement dans le projet réel.

drapeaux de compilation sont: -g -O0 -pipe -fpermissive -frtti -fno-exceptions -ffunction-sections

drapeaux Linker: -lpthread -g -rdynamic -Wl,-gc-sections -Wl,--start-group {Files here} -Wl,--end-group --verbose -Xlinker -lm

EDIT2: J'ai découvert quel drapeau est la cause: -fno-exceptions. Quelqu'un peut-il me dire pourquoi? Et si cela peut être réparé sans sauter ce drapeau?

EDIT3: Eh bien, rien à faire. Il semble que je puisse réellement omettre ce drapeau.

Répondre

1

Essayez de supprimer "stackSize = 1;"

+0

Bon point ;-) Cette application simple a commencé à travailler. Cependant, une application réelle me donne encore une trace de la ligne. Toute idée que les drapeaux du compilateur peuvent donner cet effet? – x13n

0

Le compilateur peut inclure ces fonctions. Peut essayer de recompiler avec l'option -O0.

+0

Non. -O0 est utilisé par défaut. Aussi, quand j'ai passé ce drapeau explicitement, le binaire était exactement le même. – x13n

1

Un patch pour la glibc est nécessaire. Regardez here.

Comme indiqué dans le correctif, les applications utilisateur utilisant backtrace doivent être compilées avec "-fexceptions". Si vous souhaitez une résolution complète des adresses, vous avez également besoin de "-rdynamic".