Ich versuche Callstack innerhalb eines Programms zu drucken. Leider gibt glibc backtrace() immer nur einen Datensatz zurück - Adresse der aktuellen Funktion. Ich arbeite an sh4-linux, was wahrscheinlich das Problem verursacht. Ich hatte keine Probleme, es auf x86-Architektur zu drucken.Backtrace auf sh4-linux gibt eine Funktion zurück
Beispielcode:
#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;
}
, die durch kompiliert wurde:
sh4-linux-g++ test.cpp -g -c -o test.o
sh4-linux-g++ test.o -g -rdynamic -o test
EDIT: Eigentlich dieser Code funktioniert gut. Wahrscheinlich verursacht ein Compiler-Flag dieses Verhalten im realen Projekt.
Compiler-Flags sind: -g -O0 -pipe -fpermissive -frtti -fno-exceptions -ffunction-sections
Flaggen Linker: -lpthread -g -rdynamic -Wl,-gc-sections -Wl,--start-group {Files here} -Wl,--end-group --verbose -Xlinker -lm
EDIT2: Ich fand heraus, welche Flagge die Ursache ist: -fno-exceptions
. Kann mir jemand sagen warum? Und wenn es repariert werden kann, ohne diese Flagge zu überspringen?
EDIT3: Nun, vergiss es. Es scheint, dass ich diese Flagge tatsächlich weglassen kann.
Guter Punkt ;-) Diese einfache App begann zu arbeiten. Die reale Anwendung gibt mir jedoch immer noch eine Zeile Backtrace. Irgendeine Idee, welche Compiler-Flags diesen Effekt haben könnten? – x13n