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.
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