2009-06-10 21 views
5

पर अवांछित ढेर मुझे कुछ बिंदुओं में अपने सी अनुप्रयोग की स्टैक जानकारी प्राप्त करने की आवश्यकता है। मैंने प्रलेखन पढ़ा है और नेट की खोज की है लेकिन अभी भी यह पता नहीं लगा सकता कि मैं इसे कैसे कर सकता हूं। क्या आप एक साधारण प्रक्रिया स्पष्टीकरण को इंगित कर सकते हैं? या, यहां तक ​​कि बेहतर, ढेर अवांछित उदाहरण के लिए। मुझे इसे एचपी-यूएक्स (इटेनियम) और लिनक्स के लिए चाहिए।एचपी-यूएक्स और लिनक्स

उत्तर

4

बाहर चेक linux/stacktrace.h

यहाँ एक API संदर्भ है:

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

सभी लिनक्स कर्नेल पर काम करना चाहिए

यहाँ से सी में एक विकल्प के उदाहरण है

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

#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

मुझे नहीं पता था कि एपीआई मौजूद है; कितना उपयोगी है! – Jamie

+0

एचपी-यूएक्स थो के लिए आपकी मदद नहीं करता;) – DaveR

+0

@ डेव, नाइट-पिकर: पी –

3

आप libunwind को देखने के लिए चाहते हैं - यह एक पार मंच इटेनियम स्टैक ट्रेस तनाव मुक्त करने के लिए हिमाचल प्रदेश द्वारा मूल रूप से विकसित पुस्तकालय है (जो विशेष रूप से जटिल कर रहे हैं); लेकिन बाद में कई अन्य प्लेटफार्मों में विस्तार किया गया है; जिसमें x86-Linux और Itanium-HPUX दोनों शामिल हैं।

libunwind (3) मैन पेज से; HPUX इटेनियम के लिए

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

यह shoulw काम: यहां libunwind का उपयोग कर एक ठेठ 'शो पश्व-अनुरेखन' समारोह लिखने के लिए का एक उदाहरण है http://docs.hp.com/en/B9106-90012/unwind.5.html

सरल स्टैक ट्रेस के लिए, U_STACK_TRACE() की कोशिश करो।