2012-11-09 6 views
10

Mit Blick auf this question und this question kann ich sehen, dass für backtrace_symbols() zu arbeiten, muss man mit derFlagge kompilieren.backtrace_symbols() mit beiden -static und -rdynamic

Ich habe es in einem Testprogramm ausprobiert und es funktioniert, aber ich bin ein Programm zu schreiben, die auch mit -static kompiliert und this page sagt, dass backtrace_symbols() nicht, wenn nicht funktioniert -static an den Compiler/Linker übergeben wird.

Gibt es eine schnelle Abhilfe zu diesem oder ich habe nie eine für Menschen lesbare Backtrace-Funktion in meinem statisch verknüpften Programm?

Antwort

8

Die Antwort war schon zur Hand: Es war in the same page I linked in the question. Am Ende habe ich erfolgreich libunwind verwendet.

#include <libunwind.h> 
#include <stdio.h> 

void do_backtrace() 
{ 
    unw_cursor_t cursor; 
    unw_context_t context; 

    unw_getcontext(&context); 
    unw_init_local(&cursor, &context); 

    while (unw_step(&cursor) > 0) 
    { 
     unw_word_t offset, pc; 
     char  fname[64]; 

     unw_get_reg(&cursor, UNW_REG_IP, &pc); 

     fname[0] = '\0'; 
     (void) unw_get_proc_name(&cursor, fname, sizeof(fname), &offset); 

     printf ("%p : (%s+0x%x) [%p]\n", pc, fname, offset, pc); 
    } 
} 

int main() 
{ 
do_backtrace(); 
return 0; 
} 

Ich war immer Fehler verknüpft, weil ich (wieder) war forgotting Linker-Optionen am Ende der Befehlszeile zu platzieren. Ich verstehe wirklich nicht, warum g++/gcc nicht mindestens eine Warnung ausgeben, wenn Befehlszeilenoptionen ignoriert werden. Die korrekte Befehlszeile zu kompilieren ist (-g ist nicht erforderlich):

g++ -static unwind.cpp -o unwind -lunwind -lunwind-x86 
3

Wenn Sie Ihr Programm unbedingt als statisch kompilieren müssen, können Sie immer backtrace() verwenden, um die Adressen der Funktionen herauszufinden und dann Funktionsnamen zu finden, indem Sie Debug-Informationen analysieren, zum Beispiel libdwarf.

Aber es ist keine einfache Aufgabe, also würde ich vorschlagen, Flag zu verwenden.

+0

Ja, '-static' ist obligatorisch in meinem Programm. Ich habe es auch mit 'libunwind' versucht, aber meine Beispielprogramme verbinden nicht beide unter Ubuntu 12.04 x86 und x86_64. Ich erhalte immer Verknüpfungsfehler wie: 'undefined reference ' undefined Verweis auf _Ux86_init_local' 'undefined Verweis auf _Ux86_get_reg' ' undefined Verweis auf _Ux86_get_proc_name' sowohl mit binären Ubuntu libunwind _Ux86_step' und neueste selbst erstellte libunwind heruntergeladen aus [hier] (http://download.savannah.gnu.org/releases/libunwind/). – Avio

+0

@Avio Ich habe 'libdwarf' erwähnt, nicht' libunwind'. Ich hatte keine Probleme mit 'libunwind' zu verbinden – qrdl

+0

Ich werde' libdwarf' so schnell wie möglich versuchen. Ich habe gerade 'libunwind' erwähnt, weil es ohne besondere Anforderung eine weitere interessante Alternative sein könnte. Welche Architektur/Distribution haben Sie verwendet, als Sie erfolgreich mit 'libunwind' verbunden waren? – Avio

Verwandte Themen