2009-06-10 11 views
5

C uygulamamın yığın bilgilerini belirli noktalarda almam gerekiyor. Belgeleri okudum ve Net'i aradım ama hala nasıl yapabileceğimi anlayamıyorum. Basit bir işlem açıklamasına işaret edebilir misiniz? Ya da, daha da iyisi, bir yığın açma örneğine. HP-UX (Itanium) ve Linux için buna ihtiyacım var. İşte HP-UX ve Linux'ta yığın istifleme

C alternatif bir örnek dan

http://www.cs.cmu.edu/afs/cs/Web/People/tekkotsu/dox/StackTrace_8h.html

tüm Linux çekirdekleri üzerinde çalışmak olmalı:

cevap

4

Kontrol dışarı linux/stacktrace.h İşte

bir API referanstır

http://www.linuxjournal.com/article/6391

için libunwind bakmak istiyorum
#include <stdio.h> 
#include <signal.h> 
#include <execinfo.h> 

void show_stackframe() { 
    void *trace[16]; 
    char **messages = (char **)NULL; 
    int i, trace_size = 0; 

    trace_size = backtrace(trace, 16); 
    messages = backtrace_symbols(trace, trace_size); 
    printf("[bt] Execution path:\n"); 
    for (i=0; i<trace_size; ++i) 
    printf("[bt] %s\n", messages[i]); 
} 


int func_low(int p1, int p2) { 

    p1 = p1 - p2; 
    show_stackframe(); 

    return 2*p1; 
} 

int func_high(int p1, int p2) { 

    p1 = p1 + p2; 
    show_stackframe(); 

    return 2*p1; 
} 


int test(int p1) { 
    int res; 

    if (p1<10) 
    res = 5+func_low(p1, 2*p1); 
    else 
    res = 5+func_high(p1, 2*p1); 
    return res; 
} 



int main() { 

    printf("First call: %d\n\n", test(27)); 
    printf("Second call: %d\n", test(4)); 

} 
+0

Bu API'nın var olduğunu bilmiyordum; ne kadar yararlı! – Jamie

+0

HP-UX tho;) için yardımcı olmaz;) – DaveR

+0

@dave, nit-seçici: P –

3

- Bu Itanium yığın izlerini açılması için HP tarafından orijinal olarak geliştirilen bir platformlar arası kütüphanesi (ki özellikle karmaşıktır); ancak daha sonra başka birçok platformda genişletilmiştir; Hem x86-Linux hem de Itanium-HPUX dahil.

Libunwind (3) man sayfasından; HPUX Itanium

#define UNW_LOCAL_ONLY 
#include <libunwind.h> 

void show_backtrace (void) { 
    unw_cursor_t cursor; unw_context_t uc; 
    unw_word_t ip, sp; 

    unw_getcontext(&uc); 
    unw_init_local(&cursor, &uc); 
    while (unw_step(&cursor) > 0) { 
    unw_get_reg(&cursor, UNW_REG_IP, &ip); 
    unw_get_reg(&cursor, UNW_REG_SP, &sp); 
    printf ("ip = %lx, sp = %lx\n", (long) ip, (long) sp); 
    } 
}