Tôi cần lấy thông tin ngăn xếp của ứng dụng C của tôi ở một số điểm nhất định. Tôi đã đọc tài liệu và tìm kiếm trên Net nhưng vẫn không thể tìm ra cách tôi có thể làm điều đó. Bạn có thể chỉ ra một lời giải thích quy trình đơn giản không? Hoặc, thậm chí tốt hơn, để một ví dụ về thư giãn chồng. Tôi cần nó cho HP-UX (Itanium) và Linux.Ngăn xếp thư trên HP-UX và Linux
Trả lời
Check-out linux/stacktrace.h
Dưới đây là một tài liệu tham khảo API:
http://www.cs.cmu.edu/afs/cs/Web/People/tekkotsu/dox/StackTrace_8h.html
Nên hoạt động trên tất cả các hạt nhân Linux
Dưới đây là một ví dụ khác trong C từ
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));
}
Bạn muốn xem libunwind - đây là thư viện đa nền tảng do HP phát triển ban đầu để tháo các dấu vết ngăn xếp Itanium (đặc biệt phức tạp); nhưng sau đó đã được mở rộng sang nhiều nền tảng khác; bao gồm cả x86-Linux và Itanium-HPUX.
Từ trang hướng dẫn (3) người đàn ông; đây là một ví dụ của việc sử dụng libunwind để viết một 'hiển thị vết lùi' chức năng điển hình: công việc
#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);
}
}
shoulw này cho HPUX Itanium: http://docs.hp.com/en/B9106-90012/unwind.5.html
Đối với vết đống đơn giản, hãy thử U_STACK_TRACE().
Tôi không biết rằng API đã tồn tại; hữu ích như thế nào! – Jamie
Không giúp bạn cho HP-UX tho;) – DaveR
@dave, nit-picker: P –