2012-11-09 18 views
10

this question ve this question'a bakıyorum backtrace_symbols()'un çalışması için birinin -rdynamic bayrağından derlenmesi gerekir.backtrace_symbols() hem -statik ve -dynamic ile

Ben bir test programına denedim ve çalıştığını, ama ben de -static ile derlenmiş ve this page-static derleyici/bağlayıcı geçirildiğinde backtrace_symbols() çalışmaz diyor bir program yazıyorum.

Bunun için hızlı bir çözüm var mı, yoksa statik olarak bağlantılı programımda hiç bir zaman okunabilir backtrace işlevine sahip olamayacağım.

cevap

8

Sonunda, başarıyla libunwind kullandım.

#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; 
} 

I (tekrar) komut satırının sonuna bağlayıcı seçenekleri yerleştirmek için forgotting çünkü hataları bağlayan başlamıştı. Komut satırı seçeneklerini göz ardı ederken neden g++/gcc neden en az bir uyarı vermediğini anlamıyorum. derlemenin en doğru komut satırı (-g gerekli değildir):

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

Programınızı statik olarak derlemeniz gerekiyorsa, işlevlerin adreslerini bulmak için backtrace()'u kullanabilir ve daha sonra örneğin libdwarf kullanarak hata ayıklama bilgilerini ayrıştırarak işlev adlarını bulabilirsiniz.

Ama bu basit bir iş değil, bu yüzden -rdynamic bayrağını kullanmanızı öneririm. Yanıt şu an elimizdeydi: the same page I linked in the question idi.

+0

'Evet -static' benim programda zorunludur. Ayrıca libunwind ile de çalıştım ama örnek programlarım Ubuntu 12.04 x86 ve x86_64 ile bağlantı kurmuyor. Hep gibi bağlama hataları alıyorum: İkili Ubuntu libunwind ve hem _Ux86_step' için 'tanımsız referansı _Ux86_get_proc_name' için ' tanımsız referansı _Ux86_get_reg' için 'tanımsız referansı _Ux86_init_local' için' tanımsız referansı son kendinden derlenmiş libunwind indirilebilir [buradan] (http://download.savannah.gnu.org/releases/libunwind/). – Avio

+0

@Avio 'libdwarf', libunwind'den bahsetmiştim. Ben libunwind ' – qrdl

+0

ile bağlantı kurarken hiç bir problem yaşamadım en kısa zamanda' libdwarf 'deneyeceğim. Sadece libunwind'den bahsediyordum çünkü özel bir gereksinim olmadan başka ilginç bir alternatif olabilirdi. Libunwind'e başarıyla bağlandığınız hangi mimariyi/dağıtımı kullandınız? – Avio

İlgili konular