2010-11-25 3 views
1

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.

Antwort

1

Versuchen Sie, "stackSize = 1;"

+0

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

0

Der Compiler kann diese Funktionen einbinden. Könnte versuchen, mit der -O-Option neu zu kompilieren.

+0

Nein. -O0 wird standardmäßig verwendet. Auch wenn ich dieses Flag explizit übergeben habe, war binary genau das Gleiche. – x13n

1

Ein Patch zu Glibc wird benötigt. Schau here.

Wie im Patch erwähnt, müssen Benutzeranwendungen, die backtrace verwenden, mit "-fexceptions" kompiliert werden. Wenn Sie die volle Symbolauflösung von Adressen wünschen, benötigen Sie auch "-rdynamic".

Verwandte Themen